思路:
这个题不能先排序呀!数是随机的!
一开始拿到这个题想到的是能不能用动态规划做,看着有点眼熟。但是想了想发现我不会,二维数组能表示的量不够,所以把思路转到专门的数组问题上。而这个数组处理的手段首先想到双指针。(不知道用双指针属于单纯的知识漏洞,不是问题;知道用双指针,知道双指针的思路和写法,但是写不出来才是问题)
思路就是设立快慢指针,总和sum和长度len(由于题里给了数组的长度限制,所以len一开始可以初始化为一个具体的值,比数组长度大1,这样就解决[1,1],target=2的例子),快指针遍历数组,sum加上fast对应的每个元素,一旦sum>=target,那么说明当前:
1.至少找到一个符合要求的序列,比对len与当前长度fast-slow的长度,取最小值;
2.该序列可能不是最优解,需要再次判断。
此时为了看是不是还能有更小的len,在保证sum满足要求的情况下,快指针不动,向数组末尾移动慢指针,同时sum减去慢指针所指的值,一并更新len的长度。
这样下来最后len如果从未被改变过,说明没有符合要求的序列,输出0;否则输出len即是最小长度。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int slow = 0,fast=slow;
int len=100001,sum=0;
while(fast<nums.length)
{
sum+=nums[fast];
while(sum>=target)
{
len = Math.min(fast-slow,len);
sum -= nums[slow];
slow++;
}
fast++;
}
return len==100001?0:len+1;
}
}