# 长度最小的子数组
前言:这题也算是中等题目 我次次做次次错 ,我自然是知道自己的坏习惯的 每次隔个几个月就暗暗下定决心刷算法。然后每次都是从一开始写就感到挫折。一道题写半天还是错啊,一道题想一天还是没思路啊 巴拉巴拉。不知不觉 大部分业务都能写了,结果算法还是一窍不通。自感悲哀
# 题目
给定一个含有
n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于
target的长度最小的 连续子数组
[numsl, numsl+1, ..., numsr-1, numsr],并返回其长度 **。** 如果不存在符合条件的子数组,返回0。示例 1:
1
2
3 输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:
1
2 输入:target = 4, nums = [1,4,4]
输出:1示例 3:
1
2 输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0提示:
1 <= target <= 1091 <= nums.length <= 1051 <= nums[i] <= 105进阶:
- 如果你已经实现
O(n)时间复杂度的解法,请尝试设计一个O(n log(n))时间复杂度的解法。
解法 1 暴力解法:
我的解答:
1 | public class Solution { |
因为力扣已经不让用这种方法去解答了 会超时
但这样写应该是能符合需求的
标准答案 C++ 的暴力循环
1 | class Solution { |
答案的写法 可读性和性能肯定比我的好
好了 上面都是没啥用的 因为这题要用滑动窗口去写
示例图:

209.长度最小的子数组
# 题解
1 | public class Solution { |
这里说一个可笑的小插曲
我注意一下如果换成 result = result < subSize? result :subSize; 这句 其实一样 但我写题的时候纠结很久 因为我当时纠结的地方错了 我以外如果判断顺序反了 比如写成 result = subSize< result ? subSize :result ; 我想 result 就不可能为 int.MaxValue 那如何有让 result 保持初始值的情况呢。其实是我忽略了 while 中的判断条件 如果 while 根本不进入 那 result 就会一直保持初始值。这里只是我想错了导致的无意义纠结。