题目链接:2958. 最多 K 个重复元素的最长子数组(中等)
算法原理:
解法:滑动窗口
击败10.52%
时间复杂度O(N)
👇跟下面的题思想一模一样,甚至比下面的题还简单,不需要问题转化,直接把需求告诉你了😂
①进窗口:先放哈希表里,对应次数+1
②更新:如果次数<=k,就更新
③出窗口:次数>k时,持续出窗口
Java代码:
java
class Solution {
public int maxSubarrayLength(int[] nums, int k) {
//子数组连续->滑动窗口
Map<Integer,Integer> hash=new HashMap<>();
int n=nums.length,ret=0;
for(int right=0,left=0;right<n;right++){
//进窗口
int in=nums[right];
hash.put(in,hash.getOrDefault(in,0)+1);
//更新
if(hash.get(in)<=k) ret=Math.max(ret,right-left+1);
//出窗口
while(hash.get(in)>k){
int out=nums[left];
hash.put(out,hash.get(out)-1);
if(hash.get(out)==0) hash.remove(out);
left++;
}
}
return ret;
}
}