2831. 找出最长等值子数组
思路:先将相同数的下标保存到一起,然后遍历同一个数的下标数组,用双指针找到最大的ans。时间复杂度0(n)。
class Solution {
public:
int longestEqualSubarray(vector<int>& nums, int k) {
int n=nums.size();
vector<vector<int>> v(n+1);
//这里本应该存的是实际下标,但为了方便,存的是(实际下标-新下标)
//理由:实际下标right-实际下标left+1-(新下标right-新下标left+1)>k
//化简一下:(实际下标right-新下标right)-(实际下标left-新下标left)>k
for(int i=0;i<n;i++){
v[nums[i]].push_back(i-v[nums[i]].size());
}
int ans=0;
for(int i=0;i<v.size();i++){
int l=0;
for(int r=0;r<v[i].size();r++){
while(v[i][r]-v[i][l]>k) l++;
ans=max(ans,r-l+1);
}
}
return ans;
}
};