สมมติว่าเรามีอาร์เรย์จำนวนเต็ม เราต้องหาความยาวของลำดับย่อยที่กลมกลืนกันที่ยาวที่สุดในบรรดาลำดับย่อยที่เป็นไปได้ทั้งหมด อย่างที่เราทราบกันดีว่าอาร์เรย์ของลำดับที่กลมกลืนกันคืออาร์เรย์ที่ความแตกต่างระหว่างค่าสูงสุดกับค่าต่ำสุดคือ 1 เท่านั้น
ดังนั้น หากอินพุตเป็น [1,3,2,2,5,2,3,7] ผลลัพธ์จะเป็น 5 เนื่องจากลำดับที่ต่อเนื่องกันที่ยาวที่สุดคือ [4,3,3,3,4]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งแผนที่ m
-
สำหรับ n เป็นจำนวน −
-
(เพิ่ม m[n] ขึ้น 1)
-
-
สำหรับคู่คีย์-ค่า (k,v) ในหน่วย m -
-
มัน :=ตำแหน่งของ (k+1) ในหน่วย m
-
ถ้า 'มัน' เป็น m แล้ว −
-
max_:=สูงสุดของ max_ และมูลค่าของมัน
-
-
-
ผลตอบแทนสูงสุด_
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findLHS(vector<int>& nums) {
unordered_map<int, int> m;
for (const int n : nums)
++m[n];
int max_{ 0 };
for (const auto & [ k, v ] : m) {
auto it = m.find(k + 1);
if (it != m.end())
max_ = max(max_, v + it->second);
}
return max_;
}
};
main(){
Solution ob;
vector<int> v = {2,4,3,3,6,3,4,8};
cout << (ob.findLHS(v));
} อินพุต
{2,4,3,3,6,3,4,8} ผลลัพธ์
5