LCP 68-美观的花束
力扣嘉年华的花店中从左至右摆放了一排鲜花,记录于整型一维矩阵 flowers
中每个数字表示该位置所种鲜花的品种编号。你可以选择一段区间的鲜花做成插花,且不能丢弃。 在你选择的插花中,如果每一品种的鲜花数量都不超过 cnt
朵,那么我们认为这束插花是 「美观的」。 > - 例如:[5,5,5,6,6] 中品种为 5 的花有 3 朵, 品种为 6 的花有 2
朵,每一品种 的数量均不超过 3 请返回在这一排鲜花中,共有多少种可选择的区间,使得插花是「美观的」。 注意: - 答案需要以1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1 示例 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提示: -1 <= flowers.length <= 10^5-1 <= flowers[i] <= 10^5-1 <= cnt <= 10^5
菜鸡第一次写题解用来锻炼自己的语言能力,望看到的伙伴们见谅┭┮﹏┭┮
题目理解:
·就是给你一个数组 flowers 和 一个正整数 cnt 。
·数组 flowers 存在某些非空子数组,这些子数组里面的每个数字出现的次数不能超过 cnt 。
·返回这些子数组的总数量。
算法流程:
①一个滑动窗口,左指针 left,右指针 right 。
②初始化整型变量 ans 作为满足条件的数组数量,哈希表 count 记录滑动窗口中数字的出现次数。
③ right 一直往右遍历。
④假如:滑动窗口右侧新加进的数字 x 符合要求(即 count[x]<=cnt ),则整个滑动窗口也满足题目条件要求的子数组。
⑤ ans 增加,增加的数目为 right-left+1,原因如图片所示:包含右侧新数字的符合题目要求的区间个数 (倒着数)。
⑥假如:滑动窗口右侧新加进的数字 x 不符合要求(即 count[x]>cnt ),则整个滑动窗口不满足题目条件要求的子数组。
⑦ left 开始遍历,滑动数组逐个排出左侧数字 y ,滑动窗口数字 y 出现次数减少,则 –count[y] 。
⑧直到遇到滑动窗口的左侧第一个数字 x,数字 x 的出现次数减少,count[–x]<=cnt 使得滑动窗口再次满足题目条件要求的子数组。
⑨ ans 增加,增加的数目为 right-left+1,原因如图片所示:包含右侧新数字的符合题目要求的区间个数 (倒着数)。
⑩ right 继续遍历,直到末尾停下。
ans增加:
·既然滑动窗口的这个数组符合条件,那么它的子数组也符合条件
·右侧元素是新来的,那 ans 新增加的数目就是包括右侧新元素的子数组

代码:
1 | class Solution { |