LeetCode 209. Minimum Size Subarray Sum / 713. Subarray Product Less Than K

209. Minimum Size Subarray Sum

方法一:Sliding Window

滑动窗口问题,维护一个sum<s的窗口(类似单调栈),遇到sum>=s的情况,就处理并++start。时间复杂度O(n)。

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        // remain a range whose sum<s
        int start=0, end;
        int sum=0, res=INT_MAX;
        for (end=0;end<nums.size();++end){
            sum += nums[end];
            while (sum>=s){
                res = min(res,end-start+1);
                sum -= nums[start++];
            }
        }
        return res==INT_MAX?0:res;
    }
};

 

方法二:二分

由于从0~i的sum是单调的,可以用二分找。n个元素,每个元素都要二分查找一次,因此时间复杂度O(nlogn),详见

https://leetcode.com/problems/minimum-size-subarray-sum/solution/

 

 

713. Subarray Product Less Than K

一个是乘,一个是加,实质是一样的。只不过上一题是>=s,这一题是<k,且求的是<k的个数。

方法一:Sliding Window

同样维护一个<k的窗口,[start,end] 这样一个区间,以end结尾的子数组个数正好是窗口大小。由于end都会遍历一遍,所以不会遗漏。

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        if (k<=1) return 0;
        int start=0;
        int sum=1;
        int res=0;
        for (int end=0;end<nums.size();++end){
            sum *= nums[end];
            while (sum>=k) sum/=nums[start++];
            res += end-start+1;
        }
        return res;
    }
};

 

方法二:二分

取对数就变成加法了,和上一题基本就一样了,二分时间复杂度O(nlogn)。

https://leetcode.com/problems/subarray-product-less-than-k/solution/

 

posted @ 2018-09-07 08:46  約束の空  阅读(124)  评论(0编辑  收藏  举报