题目链接:LCP 68. 美观的花束(中等)
算法原理:
解法:滑动窗口
击败18.18%
时间复杂度O(N)
1️⃣进窗口:将该种类的花在哈希表中的次数+1
2️⃣出窗口:数量超过cnt的只能是当前新进入窗口的花,如果>cnt就持续收缩左端点
3️⃣更新:因为是求子数组个数,所以ret+=right-left+1
Java代码:
java
class Solution {
public int beautifulBouquet(int[] nums, int k) {
int n=nums.length,ret=0;
//存<花类别,数量>
Map<Integer,Integer> hash=new HashMap<>();
for(int left=0,right=0;right<n;right++){
//进窗口
int in=nums[right];
hash.put(in,hash.getOrDefault(in,0)+1);
//出窗口:只有当前新加入窗口的值可能数量超过k,所以没必要再遍历一遍哈希表
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++;
}
//更新
ret+=right-left+1;
}
return ret;
}
}