题目参考:找出最长等值子数组
题解:分组 + 二分
1. 不同的值存储到不同的数组中(按下标递增的顺序),可以用一个哈希表或者平衡树索引数组
2. 对于每个元素,考虑以该元素为尾的等值子数组的最大长度,这里可以采用二分,详细参考代码
总时间复杂度
代码示例:
class Solution {
public:
int n;
int longestEqualSubarray(vector<int>& nums, int k) {
n = nums.size();
map<int, vector<int>> rec;
int ans = 1,l,r,mid;
for (int i = 0; i < n; ++i) {
auto& vec = rec[nums[i]];
vec.push_back(i);
l = 0, r = vec.size() - 1;
while (l < r) {
mid = (l + r) >> 1;
if (vec.size() - mid + k >= i - vec[mid] + 1) r = mid;
else l = mid + 1;
}
ans = max(ans, (int)vec.size() - l);
}
return ans;
}
};