LCP 68. 美观的花束
代码
ts
/**
* LCP 68. 美观的花束
* https://leetcode.cn/problems/1GxJYY/
*/
function beautifulBouquet(flowers: number[], cnt: number): number {
let left = 0;
let res = 0;
const map = new Map<number, number>();
for (let i = 0; i < flowers.length; i++) {
map.set(flowers[i], (map.get(flowers[i]) || 0) + 1);
while (map.get(flowers[i])! > cnt) {
const fl = map.get(flowers[left])!;
if (fl === 1) {
map.delete(flowers[left]);
}
else {
map.set(flowers[left], fl - 1);
}
left++;
}
res += i - left + 1;
}
return res;
}思路
滑动窗口 + 哈希表统计每种花的数量:
使用哈希表
map记录窗口内每种花的数量对于每个右端点
i:- 将
flowers[i]加入窗口,更新计数 - 当某种花的数量超过
cnt时,收缩左边界left,直到该花的数量不超过cnt - 以
i为右端点的所有有效子数组数量为i - left + 1
- 将
累加所有右端点对应的子数组数量
- 时间复杂度
,每个元素最多被访问两次(加入和移除窗口各一次) - 空间复杂度
,哈希表最多存储 种不同的花