网站做不做百度云加速,广州推广系统,it外包企业,建设厅官方网站企业库1027. 最长等差数列 给你一个整数数组 nums#xff0c;返回 nums 中最长等差子序列的长度。
回想一下#xff0c;nums 的子序列是一个列表 nums[i1], nums[i2], ..., nums[ik] #xff0c;且 0 i1 i2 ... ik nums.length - 1。并且如果 seq[i1] -…1027. 最长等差数列 给你一个整数数组 nums返回 nums 中最长等差子序列的长度。
回想一下nums 的子序列是一个列表 nums[i1], nums[i2], ..., nums[ik] 且 0 i1 i2 ... ik nums.length - 1。并且如果 seq[i1] - seq[i]( 0 i seq.length - 1) 的值都相同那么序列 seq 是等差的。 思路
本题和求斐波那契数列做法很相似不同点也就是判断不同因此同样采用多维dp来求解。规定dp[i][j]是i位置元素在前j位置元素在后构成等差子序列的最大长度。此时在0-i-1之间找k使得nums[j]-nums[i]nums[i]-nums[k],则nums[k]2*nums[i]-nums[j]求符合条件的k然后dp[i][j]dp[k][i]1。注意此处也要求k位置一定小于i位置否则k在i,j之间无法保证能在拥有i位置获得的最长等差数列加上kj位置元素仍能构成等差数列。此外在每次i指针往后移动时将前一个位置元素保存到哈希表中方便快速查找符合要求的元素。但不能在开始直接将一整个数组元素全部放入哈希表中因为同一个元素出现在i之前和j之后可能会对结构产生影响因为哈希表默认存放的是该元素最后一次出现的下标这样会导致错误。而斐波那契数列那个题开始时全放入不会有影响因为那个题是严格单调的不会出现同一个元素在不同 下标。
class Solution {
public:int longestArithSeqLength(vectorint arr) {int narr.size();vectorvectorintdp(n,vectorint(n,2));unordered_mapint,inthash;hash[arr[0]]0;int ss0;for(int i1;in;i){ for(int ji1;jn;j){ int aarr[i]*2-arr[j];if(hash.count(a)hash[a]i){dp[i][j]max(dp[i][j],dp[hash[a]][i]1 );}}hash[arr[i]]i;}int ret0;for(auto e:dp){ for(auto s:e)retmax(ret,s);}return ret;}
};