🍎道阻且长,行则将至。🍓
🌻算法,不如说它是一种思考方式🍀
算法专栏: 👉🏻123
一、🌱209. 长度最小的子数组
- 题目描述:给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target
的长度最小的连续子数组
[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回0。
- 来源:力扣(LeetCode)
- 难度:中等
- 提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
- 示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
🌴解题
1.暴力查找
直接使用两层for循环,最终找到最短子数组。所以时间复杂度是O(n^2^)。
2.双指针滑动法
我们有可能只遍历一遍数组就可以得到最短子数组:
step1:当我们遍历数组找到第一个复合条件的子数组时(例如从0到5的子数组
),长度length
赋值;
step2:我们就可以把当前子数组的第一个删去(例如从1到5的
),子数组长度length -1;
==◇==判断当前子数组会不会满足target,满足则继续step2,直到不满足条件时(4到5的),找数组下一个(4到6的)。所以以上过程就是使用两个指针来完成。
- code:
class Solution {
publicint minSubArrayLen(int target, int[] nums) {
int k=0;//从这个开始
int i=0;//到这个
int sum=0;//k到i的和
int ans=0;//没找到
sum+=nums[i];
for(;k<nums.length;k++) {
while (sum < target&&i< nums.length) {
i++;
if(i==nums.length)
break;
sum+=nums[i];
}
if(sum>=target) {//找到了
if (ans == 0) {
ans = i - k + 1;
} else
ans = ans > i - k + 1 ? i - k + 1 : ans;//是否更短子数组
sum -= nums[k];//从k下一个
}
}
return ans;
}
}
☕物有本末,事有终始,知所先后。🍭