1. 程式人生 > >Minimum Size Subarray Sum(滑動視窗和兩個指標)

Minimum Size Subarray Sum(滑動視窗和兩個指標)

一、問題描述

Description:Description:

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

Forexample:For example:

given the array [2,3,1,2,4,3] and s = 7
the subarray [4,3] has the minimal length under the problem constraint.

給定一個正整數陣列,和一個目標整數 s。從陣列中找出 元素之和≥s 的最短的子陣列,返回它的長度。

如果不存在 元素之和≥s 的子陣列,返回 0.

二、解題報告

這裡我們採用滑動視窗的思想,如下圖:


 

滑動視窗 [left, right] 初始大小為0,滑動的規則如下:

  1. 若元素之和 < s,視窗右邊沿向右延伸,直到 元素之和≥s 為止。
  2. 若元素之和 ≥ s,更新最小長度。然後視窗左邊沿右移一位(即移除視窗中第一個元素),重複第1步。

下面上程式碼:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int
len = nums.size(); if(len == 0) return 0; // 陣列為空 int minlen = INT_MAX; int sum = 0; int left = 0; // 滑動視窗的左右邊沿 int right = -1; while(right < len) { while(sum < s && right < len) sum += nums[++right]; // 向右延伸
if(sum >= s) { minlen = minlen < right-left+1 ? minlen : right-left+1; sum -= nums[left++]; } } return minlen > len ? 0 : minlen; } };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23