力扣第209题 长度最小的子数组 双指针 c++注释代码

题目

209. 长度最小的子数组

中等

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

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

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

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

进阶:

  • 如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

思路和解题方法

  • 首先,我们定义两个指针 leftright,初始时都指向数组的开头。
  • 接下来,我们通过移动 right 指针来扩展窗口,同时不断更新子数组的和 sum。当 sum 大于等于目标值 target 时,我们尝试将 left 指针右移,并更新当前子数组的长度。然后,我们继续移动 right 指针,重复上述过程。
  • 具体而言,我们先将 right 指针右移,将对应的元素加到 sum 中。如果 sum 大于等于 target,则进入内层循环。在内层循环中,我们将 left 指针右移,并从 sum 中减去对应的元素,以尝试找到更短的子数组。然后再次判断 sum 是否大于等于 target,直到 sum 小于 target 时退出内层循环。在每次移动 left 指针的过程中,我们记录下子数组的长度,并不断更新最小长度。
  • 最后,返回最小长度即为结果。如果最小长度没有被更新过,则说明不存在满足条件的子数组,返回0。

复杂度

        时间复杂度:

                O(n)

其中 n 是数组的长度。因为我们使用了两个指针来遍历整个数组,每个指针最多移动 n 次。

        空间复杂度

                O(1)

因为我们只使用了常数个额外变量来保存指针的位置、子数组的和以及最小长度。没有使用额外的数据结构或者数组。

c++ 代码

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        int left = 0, right = 0;
        int minLen = INT_MAX;  // 初始化最小子数组长度为最大整数值
        int sum = 0;  // 当前子数组的和
        
        while (right < n) {  // 右指针未超出数组范围时循环
            sum += nums[right];  // 将当前右指针对应元素加到sum中
            
            while (sum >= target) {  // 当sum大于等于目标值时进入内层循环
                minLen = min(minLen, right - left + 1);  // 更新最小子数组长度
                sum -= nums[left];  // 将左指针对应元素从sum中减去
                left++;  // 向右移动左指针
            }
            
            right++;  // 向右移动右指针
        }
        
        return minLen == INT_MAX ? 0 : minLen;  // 如果最小长度未被更新过,则返回0;否则返回最小长度
    }   
};

posted @   lenyan~  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示