长度最小的子数组--滑动窗口
生活随笔
收集整理的這篇文章主要介紹了
长度最小的子数组--滑动窗口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
暴力法
兩個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)。
總結
以上是生活随笔為你收集整理的长度最小的子数组--滑动窗口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移除元素--双指针法
- 下一篇: 移除链表元素--虚拟头结点