美文网首页
leetcode 209/lintcode 406 二分法

leetcode 209/lintcode 406 二分法

作者: Ariana不会哭 | 来源:发表于2019-01-11 05:06 被阅读0次

    这个题要注意的是题目要求是sum>=s就可以,没说非要找相等的子数列。我就是因为没看清题意浪费很多时间。
    这个题首先想到的是O(n)方法,就是用左右指针控制判断区域。

    方法二:二分法解题,虽然这样会比第一种方法慢很多,但是后面的follow up要求做了呀,所以你还是乖乖做把~~
    通过这个题找到二分法的统用套路: while(left<right) 如果后面要用到相等的情况,在最后再加上一条判断就可以了,这样避免了不必要逻辑错误~

    • code C++:
    ////O(n) my
    //int minSubArrayLen(int s, vector<int>& nums) {
    //  int left = 0, right = 0, sum = 0;
    //  int n = nums.size();
    //  int ans = INT_MAX;
    //  while (right < n) {
    //      while (sum < s&& right < n) {
    //          sum += nums[right++];
    //      }
    //
    //      while (sum >= s) {
    //          ans = min(ans, right - left);
    //          sum = sum - nums[left++];
    //      }
    //  }
    //  return ans == INT_MAX ? 0 : ans;
    //}
    
    ////O(n logn)
    //my
    int minSubArrayLen(int s, vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n + 1, 0);
        for (int i = 1; i <= n; i++) {
            dp[i] = dp[i - 1] + nums[i - 1];
        }
    
        int ans = INT_MAX;
        for (int i = 0; i <= n; i++) {
            int left = i; int right = n;
            int t = dp[i] + s;
            while (left < right) {
                int mid = left + (right - left) / 2;
                if (dp[mid] < t)
                    left = mid + 1;
                else {
                    ans = min(ans, mid - i);
                    right = mid;
                }
            }
            if (dp[left] >= t)
                ans = min(ans, left - i);
        }
        return ans == INT_MAX ? 0 : ans;
    }
    

    相关文章

      网友评论

          本文标题:leetcode 209/lintcode 406 二分法

          本文链接:https://www.haomeiwen.com/subject/ivktdqtx.html