首页 > 其他分享 >力扣-数组-滑动窗口

力扣-数组-滑动窗口

时间:2023-04-04 12:56:58浏览次数:30  
标签:遍历 窗口 res 力扣 数组 fruits 滑动 left

题目顺序

209长度最小的子数组,904水果成篮

解题思路

1.滑动窗口求解的题目中,关键词为”求解连续“

2.暴力解法是双重for循环,相当于对滑动窗口的起始和终止点都遍历

3.滑动窗口求解是,只遍历终止点,当sum符合条件时,start++,向前一步缩小窗口

4.终止条件是终止点end遍历完

 

 

 1 class Solution(object):
 2     def minSubArrayLen(self, target, nums):
 3         """
 4         :type target: int
 5         :type nums: List[int]
 6         :rtype: int
 7         """
 8         # 暴力求解 时间复杂度是n方 容易超时
 9         # 采用滑动窗口(本质与双指针相似),因为寻找的是连续子数组所以可以滑动解决
10         i = 0
11         n = len(nums)
12         res = n+1
13         sumarr = 0
14         for j in range(n): # 只遍历窗口end
15             sumarr += nums[j]
16             while sumarr>=target: # 窗口和符合条件时,窗口start向前,缩短窗口
17                 res = min(res, j-i+1)
18                 sumarr -= nums[i]
19                 i += 1
20         if res==n+1:
21             return 0
22         else:
23             return res

# 本题是最小滑动窗口,所以当符合条件时,还要缩短窗口,start向前;不符合条件时,right向前遍历

 

 

 

 1 class Solution(object):
 2     def totalFruit(self, fruits):
 3         """
 4         :type fruits: List[int]
 5         :rtype: int
 6         """
 7         # 考虑用滑动窗口解决
 8         cnt = Counter() # 计数器,是字典的子类
 9         res = 0
10         left = 0
11         for right in range(len(fruits)):
12             # 往篮子里放
13             cnt[fruits[right]] += 1
14             while len(cnt)>2:
15                 # 篮子里多于两种水果,left向前
16                 # 篮子里最多有三种水果
17                 cnt[fruits[left]] -= 1
18                 if cnt[fruits[left]] == 0:# 当left指向的水果在篮子中没了
19                     cnt.pop(fruits[left]) # 删除篮子对left水果的计数
20                 left += 1
21             res = max(res, right-left+1)
22         
23         return res

# 本题是最大滑动窗口,当符合条件时,即篮子里有两种水果,求最大水果个数,然后right继续遍历;否则left向前直到符合条件,求最大水果个数,right继续遍历。

 

标签:遍历,窗口,res,力扣,数组,fruits,滑动,left
From: https://www.cnblogs.com/shi-yi/p/17286024.html

相关文章

  • 力扣---剑指 Offer 41. 数据流中的中位数
    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是3[2,3]的中位数是(2+3)/2=2.5设计一个支持以下......
  • C语言中的窗口滑动技术
    学习文章:C语言中的窗口滑动技术C语言中的窗口滑动技术循环几乎是每个复杂问题的一部分。太多的循环/嵌套循环会增加所需的时间,从而增加程序的时间复杂性。窗口滑动技术是一种计算技术,用于减少程序中使用的嵌套循环的数量,通过用单个循环代替嵌套循环来提高程序的效率。如果......
  • 滑动窗口-leetcode344-反转字符出啊
    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。示例1:输入:s=["h","e","l","l","o"]输出:["o","l","l","e","h"]示例......
  • 滑动窗口-leetcode-167-俩树之和
    以长度为2的整数数组[index1,index2]的形式返回这两个整数的下标index1和index2。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。你所设计的解决方案必须只使用常量级的额外空间。示例1:输入:numbers=[2,7,11,15],target=9输出:[1,2]......
  • js 递归遍历树形结构数据,返回新的数组
    工作中,我们经常会遇到这样的情况:后端返回的数组,只需要取name、value生成新的数组,或者是将某个属性名修改,生成新的数组。递归是一种常见的解决问题的方法,即把问题逐渐简单化。“递归”的基本思想是:自己调用自己。实例如下handleDg(arrs,that){arrs.map((item,index)......
  • 动态数组简介
                        动态数组定义:动态数组是指在声明时没有确定数组大小的数组,即忽略圆括号中的下标;当要用它时,可随时用ReDim语句重新指出数组的大小。使用动态数组的优点是可以根据用户需要,有效利用存储空间。特点数组到底应该有多大才......
  • 最长连续序列(并查集、数组)、复原 IP 地址(字符串、回溯)、删除链表的倒数第 N 个结
    最长连续序列(并查集、数组)给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)__的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4......
  • 最小覆盖子串(哈希表、字符串)、两数之和(数组、哈希表)、二叉树的层序遍历 II(树、广
    最小覆盖子串(哈希表、字符串)给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。**注意:**如果s中存在这样的子串,我们保证它是唯一的答案。示例1:输入:s="ADOBECODEBANC",t="ABC"输出:"B......
  • 单调队列与滑动窗口一
    单调队列--滑动窗口最值问题显然O(n^2)的时间复杂度是无法接受的我们先考虑滑动窗口滑动过程中最大值的问题过程即为我们想要维护每个滑动区间的最大值,当新插入一个元素前,我们把这个区间的第一个元素移除,插入新元素,并想在尽可能贴近O(1)的时间内得到该区间的最大值......
  • 力扣26-2023.4.3
    力扣26-2023.4.3问题26.删除有序数组中的重复项方法思路:遍历数组,若后一个和前一个相同,则继续下一个;若后一个与前一个不同,则直接赋值。C++程序:#include<iostream>#include<vector>usingnamespacestd;intremoveDuplicates(vector<int>&nums){/*......