209. 长度最小的子数组

一眼暴力

一,暴力做题思路:

  暴力没什么好说的,就纯暴力解就对了

复制代码
 1 class Solution {
 2 public:
 3     int minSubArrayLen(int target, vector<int>& nums) {
 4         int result = 99999;  //为了让result的初始值可以被轻易替代
 5         for (int i = 0; i < nums.size(); i++) {
 6             int sum = 0;
 7             for (int j = i; j < nums.size(); j++) {
 8                 sum += nums[j];   //这里注意一定要先加完以后在进行判断
 9                 if (sum >= target) {
10                     result = min(result, j - i + 1);
11                     break;
12                 }
13             }
14         }
15         if (result == 99999)return 0; // 若result的值自始至终没有被替换过,则证明没有达到条件,则返回0
16         else return result;
17     }
18 };
复制代码

 

二,快慢指针的滑动窗口的做题思路

  1,把快慢指针圈起来的区域看作一个滑动窗口,每次快指针向外面拓展,窗口的值就增大,当窗口值符合条件时,更新数据,然后把慢指针++,相当于回缩窗口,让窗口回到没有符合条件的时候(如果回缩一次不够,那么就两次,直到符合条件为止,故这里不能用 if,用 while !

  2,剩下的就和暴力差不多了,快慢指针的作用是用一个 for 完成了 两个 for 完成的事

复制代码
 1 class Solution {
 2 public:
 3     int minSubArrayLen(int target, vector<int>& nums) {
 4         int slow = 0, sum = 0, result = 99999; //经典初始化
 5         for (int fast = 0; fast < nums.size(); fast++) {
 6             sum += nums[fast];   
 7             while (sum >= target) {   //这里注意一定不是if,而是while!!因为可能sum -= nums[slow] 后,仍然符合 sum >= target 的条件
 8                 result = min(result, fast - slow + 1);
 9                 sum -= nums[slow];
10                 slow++;   //注意窗口要回缩
11             }
12         }
13         if (result == 99999)return 0;
14         else return result;
15     }
16 };
复制代码

 

  

posted @   北原春希  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示