力扣--数组209.长度最小的子数组

本文介绍了如何将查找连续子数组最小长度的问题从暴力的O(n^2)时间复杂度改进到线性时间复杂度O(n),通过使用滑动窗口技巧,减少了不必要的计算。作者对比了两种方法并展示了优化后的解决方案。
摘要由CSDN通过智能技术生成

这题想暴力解决不难。 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。

如:

class Solution {
public:
    // 函数用于查找连续子数组的最小长度,其和大于或等于给定的目标值。
    int minSubArrayLen(int target, vector<int>& nums) {
        // 将结果初始化为正无穷大。
        int result = INT_MAX;
        
        // 遍历数组中的每个索引。
        for (int i = 0; i < nums.size(); i++) {
            // 初始化当前子数组的和。
            int sum = 0;
            
            // 从当前索引迭代到数组的末尾。
            for (int j = i; j < nums.size(); j++) {
                // 累加当前元素到子数组和中。
                sum += nums[j];
                
                // 如果子数组和大于或等于目标值,则更新结果为当前子数组的长度。
                if (sum >= target) {
                    result = min(result, j - i + 1);
                    break;
                }
            }
        }
        
        // 如果结果不是正无穷大,则返回结果;否则返回 0。
        if (result != INT_MAX)
            return result;
        else
            return 0;
    }
};

但是如何用时间复杂度更低的方法呢???
很简单,与暴力方法的代码区别也不大。用滑动窗口,终端j每次不回到i。

class Solution {
public:
    // 求解最小长度子数组的函数
    int minSubArrayLen(int target, vector<int>& nums) {
        // 初始化结果为整型最大值
        int result = INT_MAX;
        // 初始化两个指针 i 和 j,分别表示子数组的起始和结束位置
        int i, j;
        // 初始化当前子数组的和为第一个元素的值
        int sum = nums[0];

        // 循环遍历数组
        for (i = 0, j = 0; i < nums.size() && j < nums.size();) {
            // 如果当前子数组的和大于等于目标值
            if (sum >= target) {
                // 更新结果为当前子数组的长度与之前结果的较小值
                result = min(result, j - i + 1);
                // 减去子数组起始位置的元素,并将起始位置指针向右移动
                sum -= nums[i];
                i++;
            } else {
                // 如果还有元素可以添加到子数组中
                if (j != nums.size() - 1) {
                    // 将结束位置指针向右移动,并加上新的元素到当前子数组中
                    j++;
                    sum += nums[j];
                } else {
                    // 如果已经到达数组末尾,则退出循环
                    break;
                }
            }
        }

        // 如果结果被更新过,返回最小长度;否则返回0
        if (result != INT_MAX)
            return result;
        else
            return 0;
    }
};

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值