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/