请问为什么我的代码会超时呢?
来源: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
相似问题