今日份題目:
給你一個整數數組 arr
和一個整數 difference
,請你找出并返回 arr
中最長等差子序列的長度,該子序列中相鄰元素之間的差等于 difference
。
子序列 是指在不改變其余元素順序的情況下,通過刪除一些元素或不刪除任何元素而從 arr
派生出來的序列。
示例1
輸入:arr = [1,2,3,4], difference = 1 輸出:4 解釋:最長的等差子序列是 [1,2,3,4]。
示例2
輸入:arr = [1,3,5,7], difference = 1 輸出:1 解釋:最長的等差子序列是任意單個元素。
示例3
輸入:arr = [1,5,7,8,5,3,4,2,1], difference = -2 輸出:4 解釋:最長的等差子序列是 [7,5,3,1]。
提示
-
1 <= arr.length <= 105
-
-104 <= arr[i], difference <= 104
題目思路
這道題目,我們假設選擇當前數據,那么到目前數值為止的最長序列長度應該為這個數值減去difference的那個數記錄的長度加一,所以得到狀態轉移方程:dp[arr[i]]=dp[arr[i]-difference]+1;
注意:由于arr[i]的數據范圍有負數,普通的數組不能用來記錄有負數的情況,故使用unordered_map記錄dp值。
代碼
class Solution
{
public:int longestSubsequence(vector<int> &arr, int difference) {int ans=0;unordered_map<int,int> dp; //假設結果序列選擇當前數據,那么到目前數值為止的最長序列長度為狀態轉移方程for(int i=0;i<arr.size();i++) {dp[arr[i]]=dp[arr[i]-difference]+1; //狀態轉移方程ans=max(ans,dp[arr[i]]); //記錄最大結果}return ans;}
};
提交結果
歡迎大家在評論區討論,如有不懂的部分,歡迎在評論區留言!
更新不易,寶子們點個贊支持下,謝謝!