力扣OJ 1218. 最長定差子序列

給你一個整數數組 arr 和一個整數 difference,請你找出 arr 中所有相鄰元素之間的差等於給定 difference 的等差子序列,並返回其中最長的等差子序列的長度。

 

示例 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 <= 10^5
-10^4 <= arr[i], difference <= 10^4

 

如果只需要O(n^2)的算法,那就太簡單了,那就和 力扣 OJ 300. 最長上升子序列

https://blog.csdn.net/nameofcsdn/article/details/104086350  沒有什麼區別,

直接微改得到的代碼是這樣的:

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {
        map<int, int>ans;
		ans[0] = 1;
		for (int i = 1; i < arr.size(); i++)
		{
			ans[i] = 1;
			for (int j = 0; j < i; j++)
				if (arr[j]+difference == arr[i] && ans[i] < ans[j] + 1)ans[i] = ans[j] + 1;
		}
		int m = 0;
		for (int i = 0; i < arr.size(); i++)if (m < ans[i])m = ans[i];
		return m;
    }
};

果然超時。

這個題目明顯需要O(n)的算法,

思路還是一樣,只需要基於數據結構進行時間優化即可

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {
        map<int, int>ans;
        int res=0;
		for (int i = 0; i < arr.size(); i++)
		{
            ans[arr[i]]=max(ans[arr[i]],ans[arr[i]-difference]+1);
            res=max(res,ans[arr[i]]);
		}
		return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章