列表

详情


LCP 68. 美观的花束

力扣嘉年华的花店中从左至右摆放了一排鲜花,记录于整型一维矩阵 flowers 中每个数字表示该位置所种鲜花的品种编号。你可以选择一段区间的鲜花做成插花,且不能丢弃。 在你选择的插花中,如果每一品种的鲜花数量都不超过 cnt 朵,那么我们认为这束插花是 「美观的」。

请返回在这一排鲜花中,共有多少种可选择的区间,使得插花是「美观的」。

注意:

示例 1:

输入:flowers = [1,2,3,2], cnt = 1

输出:8

解释:相同的鲜花不超过 1 朵,共有 8 种花束是美观的; 长度为 1 的区间 [1]、[2]、[3]、[2] 均满足条件,共 4 种可选择区间 长度为 2 的区间 [1,2]、[2,3]、[3,2] 均满足条件,共 3 种可选择区间 长度为 3 的区间 [1,2,3] 满足条件,共 1 种可选择区间。 区间 [2,3,2],[1,2,3,2] 都包含了 2 朵鲜花 2 ,不满足条件。 返回总数 4+3+1 = 8

示例 2:

输入:flowers = [5,3,3,3], cnt = 2

输出:8

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int beautifulBouquet(vector<int>& flowers, int cnt) { } };

python3 解法, 执行用时: 284 ms, 内存消耗: 25.1 MB, 提交时间: 2022-11-18 14:51:48

class Solution:
    def beautifulBouquet(self, flowers: List[int], cnt: int) -> int:
        ans = left = 0
        c = Counter()
        for right, x in enumerate(flowers):
            c[x] += 1
            while c[x] > cnt:
                c[flowers[left]] -= 1
                left += 1   # 左指针右移1位
            ans += right - left + 1
        return ans

golang 解法, 执行用时: 96 ms, 内存消耗: 8.9 MB, 提交时间: 2022-11-18 14:43:24

func beautifulBouquet(flowers []int, cnt int) (ans int) {
	c := map[int]int{}
	left := 0
	for right, x := range flowers {
		c[x]++
		for c[x] > cnt {
			c[flowers[left]]--
			left++
		}
		ans += right - left + 1
	}
	return ans % (1e9 + 7)
}

python3 解法, 执行用时: 288 ms, 内存消耗: 25 MB, 提交时间: 2022-11-18 14:40:43

class Solution:
    def beautifulBouquet(self, flowers: List[int], cnt: int) -> int:
        ans = left = 0
        c = Counter()
        for right, x in enumerate(flowers):
            c[x] += 1
            while c[x] > cnt:
                c[flowers[left]] -= 1
                left += 1
            ans += right - left + 1
        return ans % (10 ** 9 + 7)

上一题