请问为什么我的代码会超时呢?
来源:3-7 滑动窗口 Minimum Size Subarray Sum
tataxqy
2019-04-03
public class Test {
public int minSubArrayLen(int s, int[] nums) {
int l=0;
int r=-1;
int res=nums.length+1;
int sum=0;
while(l<nums.length)
{
if(r+1<nums.length&&sum<s)
{
r++;
sum+=nums[r];
}else if(sum>=s)
{
l++;
sum-=nums[l];
}
if(sum>=s)
res=Math.min(res,r-l+1);
}
return res;
}
}写回答
1回答
-
你的算法不是超时,而是陷入了死循环。换句话说,l < nums.length 可能永远成立。
为你的程序添加这样的一个main函数就能测试出来。建议自己实际debug,看看为什么陷入了死循环?
class Solution { public int minSubArrayLen(int s, int[] nums) { int l=0; int r=-1; int res=nums.length+1; int sum=0; while(l<nums.length) { if(r+1<nums.length&&sum<s) { r++; sum+=nums[r]; }else if(sum>=s) { l++; sum-=nums[l]; } if(sum>=s) res=Math.min(res,r-l+1); } return res; } // 测试 public static void main(String[] args) { int[] arr = {2, 3, 1, 2, 4, 3}; int res = (new Solution()).minSubArrayLen(7, arr); System.out.println(res); } }==========
原因:
你的代码14行,只有在sum >= s的时候,才会l++,但是,如果既不满足这个if,又不满足else if,l就永远不会变,使得程序陷入死循环。
另外,这个else if里面的逻辑也有问题。应该先sum -= nums[l],再l++。
继续加油!:)
042019-04-03
相似问题