You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
class Solution {
public long countGood(int[] nums, int k) {
int n = nums.length;
int l = 0, r = 0;
Map<Integer, Integer> map = new HashMap<>();
long cnt = 0, ans = 0;
while (r < n) {
cnt += map.getOrDefault(nums[r], 0);
map.put(nums[r], map.getOrDefault(nums[r], 0) + 1);
while (cnt >= k && l < r) {
cnt -= map.get(nums[l]) - 1;
map.put(nums[l], map.get(nums[l]) - 1);
++l;
}
++r;
}
return ans;
}
}
这道题我花的时间有点太久了,虽然最后做出来了很开心。
考虑到递进的思想,每次从左到右加一个nums[i],可以通过之前存储相同nums[i]的个数,计算pair。容易想到用滑动窗口。
难点在于:
解决方法:
Tips1:
又看了下别人的做法,大多数并没有逆向思维进行集合计算,可能是太麻烦了。
那么首先是滑动窗口的移动,那么右边界的停止当然是子数组中[l,r]中pair的数量超过k了,因为l要向左移动,肯定pair的数量减少。
接着计算大于k的子数组数量,这里分两种,可以以左边界为准,或者以右边界为准。以左边界为准的情况下,当pair的数量大于等于k,说明右边界后的n-r个子数组的pair的数量都是大于等于k的,所以可以加入到答案。如下代码:
如果是以右边界为准的情况,则对l进行计算。
所以关键是窗口移动过程中找到符合题目条件的数量的关系。
Tips2:
类似题目:
The text was updated successfully, but these errors were encountered: