สมมติว่าเรามีอาร์เรย์จำนวนเต็ม arr และผลต่างของจำนวนเต็ม เราต้องหาความยาวของลำดับย่อยที่ยาวที่สุดใน arr ซึ่งเป็นลำดับเลขคณิตเพื่อให้ความแตกต่างระหว่างองค์ประกอบที่อยู่ติดกันในลำดับต่อมา ก็เหมือนกับความแตกต่าง ดังนั้นหากอินพุตเป็นเหมือน [1,5,7,8,5,3,4,2,1] และผลต่างคือ -2 แล้วผลลัพธ์จะเป็น − 4 เนื่องจากลำดับเลขคณิตที่ยาวที่สุดคือ [7,5, 3,1]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดแผนที่ m
- n :=ขนาดของอาร์เรย์ arr ตั้งค่าเป็น :=0
- สำหรับ i ในช่วง 0 ถึง n – 1
- x :=arr[i]
- m[x] :=1 + m[x - d]
- ans :=สูงสุดของและ m[x]
- คืนสินค้า
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อทำความเข้าใจ −
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int longestSubsequence(vector<int>& arr, int d) {
int n = arr.size();
map <int,int> m;
int ans = 0;
for(int i =0;i<n;i++){
int x = arr[i];
m[x] = 1 + (m[x-d]);
ans = max(ans,m[x]);
}
return ans;
}
};
main(){
vector<int> v1 = {1,5,7,8,5,3,4,2,1};
Solution ob;
cout <<ob.longestSubsequence(v1, -2);
} อินพุต
[1,5,7,8,5,3,4,2,1] -2
ผลลัพธ์
4