11--209. 长度最小的子数组
1.L1-两数之和2.L2-二分查找3.L-3: 35.搜索插入位置4.6 -- 27. 移除元素5.L5-367. 有效的完全平方数6.L4: 69.x的平方根7.L-4: 34--在排序数组中查找元素的第一个和最后一个位置8.H-29.H-三数之和10.链表指向问题(pre = cur.next与cur.next = pre)11.Java链表12.力扣T26与T27的区别13.7--26. 删除有序数组中的重复项14.8--283. 移动零15.12--76. 最小覆盖子串
16.11--209. 长度最小的子数组
17.10--977. 有序数组的平方18.9--844. 比较含退格的字符串19.19.删除链表的倒数第N个结点20.27,移除元素21.459.重复的字符串22.28.KMP算法--leetcode23.13--2. 两数相加给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]
是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
【暴力解法超时】
【双重for循环代码如下:】
class Solution { public int minSubArrayLen(int target, int[] nums) { int min = Integer.MAX_VALUE; //这行代码将 min 初始化为整型的最大值,以确保 //任何比这个值小的子数组长度都可以成为 min 的初始值 for (int i = 0; i < nums.length; i++) { int sum = nums[i]; if (sum >= target) { return 1; } for (int j = i + 1; j < nums.length; j++) { sum += nums[j]; if (sum >= target) { min = Math.min(min, j - i + 1);//这行代码用于更新 min 的值。在每次找到一个满足条件的子数组时, //它会计算当前子数组的长度 j - i + 1,并与当前的 min 值进行比较,取较小的值作为新的 min 值 break; } } } return min == Integer.MAX_VALUE ? 0 : min; } }
【滑动窗口(实际上是队列相加)】
class Solution { public int minSubArrayLen(int target, int[] nums) { //l = low, h = high, sum用来记录滑动窗口的总值 //h用来滑动(或者说h用来入队,l用来出队) int l = 0, h = 0, sum = 0; int min = Integer.MAX_VALUE; while (h < nums.length) { sum += nums[h]; h++; while (sum >= target) { min = Math.min(min, h - l); //因为是先加的,h又移动的,所以直接h-l,不用再+1 sum -= nums[l]; //出队 l++; } } return min == Integer.MAX_VALUE ? 0 : min; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了