209 Minimum Size Subarray Sum

2016-11-30  本文已影响0人  yangqi916

这道题给定了我们一个数字,让我们求子数组之和大于等于给定值的最小长度。

//
//  main.cpp
//  leetcode
//
//  Created by YangKi on 15/11/19.
//  Copyright © 2015年 YangKi. All rights reserved.
#include<vector>
#include<algorithm>
#include<cstdio>
#include <unordered_map>
#include <cmath>
using namespace std;

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int size = (int)nums.size();
        
        if (size == 0)
        {
            return 0;
        }
        
        int left = 0;
        int right = 0;
        int length;
        
        int sumOfWindow = nums[0];
        
        // 先扩大(right 右移)
        while (sumOfWindow < s)
        {
            right ++;
            if (right > size - 1)
            {
                break;
            }
            
            sumOfWindow += nums[right];
        }
        
        if (right == size)
        {// 说明全加一起也小于s
            return 0;
        }
        
        // 否则,先确定一个窗口大小
        length = right - left + 1;
        
        // 接下来就是尝试有没有更小的窗口
        while (right <= size -1)
        {
            // 尝试缩小(left 右移)
            while (sumOfWindow - nums[left] >= s)
            {
                sumOfWindow -= nums[left];
                left++;
                length --;
                if (length == 1)
                {
                    return 1;
                }
            }
            
            // 不能再缩小了,只能整体右移
            if (right + 1 >= size)
            {// 已经不能右移了
                return length;
            }
            
            sumOfWindow = sumOfWindow - nums[left] + nums[right + 1];
            left ++;
            right ++;
        }
        
        return length;
        
    }
};
上一篇下一篇

猜你喜欢

热点阅读