请问为什么我的代码会超时呢?

来源: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回答

liuyubobobo

2019-04-03

你的算法不是超时,而是陷入了死循环。换句话说,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++。


课程代码的Java版本,可以参考:https://github.com/liuyubobobo/Play-with-Algorithm-Interview/blob/master/03-Using-Array/Course%20Code%20(Java)/07-Minimum-Size-Subarray-Sum/src/Solution3.java


继续加油!:)

0
4
tataxqy
回复
liuyubobobo
好的谢谢老师
2019-04-03
共4条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程