1. 程式人生 > >LeetCode: 209. Minimum Size Subarray Sum

LeetCode: 209. Minimum Size Subarray Sum

題目描述

Given an array of ``n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn’t one, return 0 instead.

**Example: **

Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: the subarray [4,3] has the minimal length under the problem constraint.

Follow up:

If you have figured out the O(n^2) solution, 
try coding another solution of which the time complexity is O(n log n). 

解題思路 —— 前序和+二分查詢

先求得前序和,然後根據前序和,二分查找出滿足要求的最短的連續子陣列。

AC 程式碼

class Solution {
    // [beg,  end)
    int binarySearch(const vector<int>& frontSum, int beg, int end,
int target) { if(beg >= end) return beg; int mid = (beg+end)/2; if(frontSum[mid] == target) return mid; else if(frontSum[mid] > target) return binarySearch(frontSum, beg, mid, target); else return binarySearch(frontSum, mid+1, end, target); }
public: int minSubArrayLen(int s, vector<int>& nums) { if(nums.empty()) return 0; // 前序和 vector<int> frontSum; for(int i = 0; i <= nums.size(); ++i) { if(i == 0) frontSum.push_back(0); else frontSum.push_back(nums[i-1]+frontSum.back()); } int minLen = 0; for(int i = 0; i < nums.size(); ++i) { // 二分查詢 int idx = binarySearch(frontSum, i+1, frontSum.size(), frontSum[i]+s); if(idx < frontSum.size() && (minLen == 0 || minLen > idx-i)) { minLen = idx -i; } } return minLen; } };