乍一看觉得这个题思路很明显,滑动窗口可以解答,但是忘了咋写,就用笨办法讨论着做:
class Solution(object):
def beautifulBouquet(self, flowers, cnt):
"""
:type flowers: List[int]
:type cnt: int
:rtype: int
"""
dict_comb = {}
for i in range(1, len(flowers)+1):
if i <= cnt:
dict_comb[i] = dict_comb.get(i, len(flowers)+1-i)
# print("i = {} res = {}".format(i, dict_comb[i]))
else:
tmp = 0
for j in range(0, len(flowers)):
list_tmp = flowers[j:j+i]
if len(list_tmp) != i:
break
else:
# print("i= {} j={} list_tmp:{}".format(i,j, list_tmp))
count = list(Counter(list_tmp).values())
# print("List={}".format(Counter(list_tmp)))
# print("count={}".format(count))
if max(count) <= cnt:
tmp+=1
dict_comb[i] = dict_comb.get(i, tmp)
# print("i = {} res = {}".format(i, dict_comb[i]))
return sum(dict_comb.values())% 1000000007
超时了。还是得看看滑动窗口/双指针怎么做。
窗口滑动的过程就是窗口数据在某段数据上按照某个步长遍历对照的过程
滑动窗口算法三个要素: 窗口长度,滑动长度,滑动步长。
https://blog.csdn.net/qq_55433334/article/details/127179881
双指针主要参考了大佬的B站视频,很详细
这样一个缩小区间的观点很有用!
补充一些双指针的知识:
双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。
双指针分为「对撞指针」、「快慢指针」、「分离双指针」。
对撞指针:两个指针方向相反。适合解决查找有序数组中满足某些约束条件的一组元素问题、字符串反转问题。
快慢指针:两个指针方向相同。适合解决数组中的移动、删除元素问题,或者链表中的判断是否有环、长度问题。
分离双指针:两个指针分别属于不同的数组 / 链表。适合解决有序数组合并,求交集、并集问题。
————————————————
版权声明:本文为CSDN博主「拾忆&长安」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: https://blog.csdn.net/qq_61707205/article/details/124780860