链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/
思路
创建两个数组索引 L(左),R(右),每次比较两索引之间的值和是否大于s,如果大于等于s,记录当前最小满足条件长度,并将L索引+1。如果小于s,则将R索引+1,使用while循环。事件复杂度为O(n)结果代码如下:
public int minSubArrayLen(int s, int[] nums) {
if (nums.length == 0) {
return 0;
}
int l = 0;
int r = 0;
int min = Integer.MAX_VALUE;
int num=nums[l];
while (r < nums.length) {
System.out.println(min);
if (num >= s) {
min = min > r - l+1 ? r - l+1 : min;
num-=nums[l];
l++;
}else if (r<nums.length-1){
r++;
num+=nums[r];
}else {
r++;
}
}
if (min==Integer.MAX_VALUE){
return 0;
}else {
return min;
}
}
运行通过
官方题解
官方题解:双指针和我的思路一致,只不过官方实现方法更简洁,利用while嵌套,外层while判断是否end索引循环到数组末端,内层while判断当前索引是否满足条件。值得我们学习的代码:
public int minSubArrayLen(int s, int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
int ans = Integer.MAX_VALUE;
int start = 0, end = 0;
int sum = 0;
while (end < n) {
sum += nums[end];
while (sum >= s) {
ans = Math.min(ans, end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}