LeetCode 刷题 209

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0

自己的思路

使用双指针, 快指针进行遍历, 定义一个sum存储fast遍历过的元素的和, 当sum < target时 就++fast, sum += num[fast], 再与target进行比较, 如果sum >= taget , 说明slow 到 fast的是满足条件的连续子数组, 但不一定长度最小。 定义一个ans 记录此时子数组的长度。 此时应该 ++slow 而不是++fast, 因为++fast后的数组一定比当前数组长。当然++slow前应该 sum -= num[slow], 这是为了看去掉slow元素后的子数组是否还满足条件, 若满足 则删除slow处元素的数组更短。 如果不满足 继续++fast, 重复上述过程, 直到遍历结束。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0;
        int ans = INT32_MAX;
        int slow = 0, fast = -1;

        while (fast != nums.size())
        {
            if (nums[0] >= target)
                return 1;
            
            
            if (sum >= target)
            {
                if (fast - slow + 1 < ans)
                {
                    ans = fast - slow + 1;
                }
                sum -= nums[slow];
                ++slow;
            }
            else
            {
                ++fast;
                if (fast == nums.size())
                    break;
                sum += nums[fast];
            }
        }
        return ans == INT32_MAX ? 0 : ans;
    }
};

优化下代码

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0;
        int ans = INT32_MAX;
        int slow = 0, fast = 0;

        while (fast != nums.size())
        {
            if (nums[0] >= target)
                return 1;

            sum += nums[fast];
            
            while (sum >= target)
            {
                ans = fast - slow + 1 < ans ? fast - slow + 1 : ans;
                sum -= nums[slow];
                ++slow;
            } 

            ++fast;
        }
        
        return ans == INT32_MAX ? 0 : ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值