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/

 

转载于:https://www.cnblogs.com/hankunyan/p/9602503.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值