算法刷题记录.leetcode209.长度最小的子数组

88 阅读1分钟

题目表述

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

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

来源:力扣(LeetCode)
链接:leetcode.cn/problems/mi…

难点分析和解法

暴力解法直观纯粹,两层循环,一层找起点,一层找终点。但时间复杂度太高。
本题难点在于利用双指针的滑动窗口原理降低复杂度

利用accumulate()函数判断和与target比较,进行剪枝

  • if(accumulate(nums.begin(), nums.end(), 0) < target) return 0;

双指针法创造滑动窗口

首先,起始指针i和终止指针j同时指向起点第一个元素。然后,终止指针j循环遍历数组,直到找到第一个满足条件,和大于等于target的子数组。此时,循环遍历起始指针i,直到找到满足条件的最短子数组。
继续往复循环,滑动窗口一直在寻找满足条件的子数组,直到j循环结束,确定最终子数组。

我的BUG

  • 代码思路不清晰:指针 i 进行窗口起始位置滑动时,代码冗余:用一个while循环就可解决。
  • sum -= nums[i]:由于先对 i 执行自减操作,这里实际上减去的是有效数据的下一个数据。