leetcode209. Minimum Size Subarray Sum

13 篇文章 2 订阅
1 篇文章 0 订阅

题目

Given an array of positive integers nums and a positive integer target, return the minimal length of a
subarray
whose sum is greater than or equal to target. If there is no such subarray, return 0 instead.

Example 1:

Input: target = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: The subarray [4,3] has the minimal length under the problem constraint.
Example 2:

Input: target = 4, nums = [1,4,4]
Output: 1
Example 3:

Input: target = 11, nums = [1,1,1,1,1,1,1,1]
Output: 0

Constraints:

1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 104

Follow up: If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log(n)).

解法分析

可以用暴力解法来进行
时间复杂度是n方

也可以用双指针滑动窗口来进行
时间复杂度是n

但是这题还提供了一个深入的跟进思考
建议再想一个时间复杂度是nlogn的方法

暴力解法在leetcode中会超时

该题需要考虑边界条件以及双循环变量使用时数组的边界越界问题

暴力解法

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int max = 0;
        for(int i = 0; i < nums.size(); i++){
            max += nums[i];
        }
        if(target > max)
            return 0;
        else if(target == max)
            return nums.size();
        else{
            int subl;  // minimum is 1
            int sum;
            int minl = 100000;
            for(int i = 0; i < nums.size(); i++){
                int j = i;
                subl = 1;
                sum = 0;
                sum += nums[i];
                while(sum < target && j < nums.size()){
                    if(j == nums.size()-1)
                        break;
                    j++;
                    sum += nums[j];
                    subl++;
                }
                if(sum >= target){
                    if(subl == 1)
                        return 1;
                    if(subl <= minl)
                        minl = subl;
                }
            }
            return minl;
        }
    }
};

双指针滑动窗口解法



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Every DAV inci

小辣鸡一枚,不求打赏啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值