日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

长度最小的子数组--滑动窗口

發布時間:2024/4/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 长度最小的子数组--滑动窗口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

暴力法

兩個for循環,然后不斷的尋找符合條件的子序列,時間復雜度很明顯是O(n^2) 。

時間復雜度:O(n^2) 空間復雜度:O(1) class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int result=INT32_MAX;//最終結果。要返回長度最小長度,起始設置為最大,等待更新int sum; //用來計算子序列的數值之和int sublen;//用來記錄子序列的長度int size=nums.size();for(int ii=0;ii<size;ii++){// 設置子序列起點為iisum=0;for(int jj=ii;jj<size;jj++){ // 設置子序列終止位置為jjsum+=nums[jj];if(sum>=target){// 一旦發現子序列和超過了target,更新resultsublen=jj-ii+1;// 計算子序列的長度result=result<sublen ? result:sublen;break;// 因為我們是找符合條件最短的子序列,所以一旦符合條件就break}}}// 如果result沒有被賦值的話,就返回0,說明沒有符合條件的子序列return result==INT32_MAX? 0:result;} };

滑動窗口

所謂滑動窗口,「就是不斷的調節子序列的起始位置和終止位置,從而得出我們要想的結果」。

其實從動畫中可以發現滑動窗口也可以理解為雙指針法的一種!只不過這種解法更像是一個窗口的移動,所以叫做滑動窗口更適合一些。

在本題中實現滑動窗口,主要確定如下三點:

窗口內是什么?
如何移動窗口的起始位置?
如何移動窗口的結束位置?

窗口就是 滿足其和 ≥ s 的長度最小的 連續 子數組。

窗口的起始位置如何移動:如果當前窗口的值大于s了,窗口就要向前移動了(也就是該縮小了)。

窗口的結束位置如何移動:窗口的結束位置就是遍歷數組的指針,窗口的起始位置設置為數組的起始位置就可以了。

解題的關鍵在于 窗口的起始位置如何移動,如圖所示:

可以發現「滑動窗口的精妙之處在于根據當前子序列和大小的情況,不斷調節子序列的起始位置。從而將O(n^2)的暴力解法降為O(n)。

class Solution{ public:int minSubArrayLen(int target,vector<int>& nums){int result=INT32_MAX;int sum=0; // 滑動窗口數值之和int sublen=0;// 滑動窗口的長度int ileft=0;//滑動窗口起始位置int size=nums.size();//滑動窗口結束位置其實就是遍歷數組的指針for(int iright=0;iright<size;iright++){sum+=nums[iright];while(sum>=target){sublen=iright-ileft+1;result=result<sublen? result:sublen;//雙指針暴力解法中是跳出第二層循環到第一層循環刷新sum=0,然后移動子序列起點,在進入第二層循環重新計算sum//此處滑動窗口,直接改變滑動窗口起始位置,不必將sum歸零重新計算,只是把起始位置值刪去即可sum-=nums[ileft++];// 這里體現出滑動窗口的精髓之處,不斷變更i(子序列的起始位置)}} return result==INT32_MAX? 0:result;} };

總結

以上是生活随笔為你收集整理的长度最小的子数组--滑动窗口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。