【LeetCode-中等】209.長度最小的子數組-雙指針/滑動窗口

力扣題目鏈接

1. 暴力解法

這道題的暴力解法是兩層嵌套for循環,第一層循環從 i = 0 開始遍歷至數組末尾,第二層循環從 j = i 開始遍歷至找到總和大于等于 target 的連續子數組,并將該連續子數組的長度與之前找到的子數組長度相比較,若這個子數組長度更短,則更新結果。并將初始長度設置為 INT32_MAXnums.size() + 1,用于判斷是否不存在符合條件的子數組,通過判斷結果是否被賦值,若未被賦值就返回0,說明沒有符合條件的子序列。

//時間復雜度:O(n^2)
//空間復雜度:O(1)
class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {int result = INT32_MAX; // 最終的結果int sum = 0; // 子序列的數值之和int subLength = 0; // 子序列的長度for (int i = 0; i < nums.size(); i++) { // 設置子序列起點為isum = 0;for (int j = i; j < nums.size(); j++) { // 設置子序列終止位置為jsum += nums[j];if (sum >= s) { // 一旦發現子序列和超過了s,更新resultsubLength = j - i + 1; // 取子序列的長度result = result < subLength ? result : subLength;break; // 因為我們是找符合條件最短的子序列,所以一旦符合條件就break}}}// 如果result沒有被賦值的話,就返回0,說明沒有符合條件的子序列return result == INT32_MAX ? 0 : result;}
};

2. 滑動窗口

上述暴力解法提交會超時。
所謂滑動窗口,就是不斷的調節子序列的起始位置和終止位置,從而得出我們要想的結果
在暴力解法中,是一個for循環滑動窗口的起始位置,一個for循環為滑動窗口的終止位置,用兩個for循環 完成了一個不斷搜索區間的過程。滑動窗口只用一個for循環來完成這個操作。

而這個循環的索引,一定是表示 滑動窗口的終止位置

下面是代碼隨想錄中給出的運用滑動窗口解決問題的過程,非常的簡潔明了:
209.長度最小的子數組

  • 窗口的結束位置 j 就是遍歷數組的指針,也就是for循環里的索引。i 則代表窗口的起始位置。
  1. 窗口的結束位置 j 首先不斷右移并執行 sum +=nums[j] 計算當前從指針 i 到 j 的子數組之和。
  2. sum >= target時,此時得到一個總和大于等于 target 的連續子數組,其長度為count = j - i + 1,此時需判斷該長度是否比已記錄的最短長度要小,若小于則更新最短長度。
  3. 隨后,窗口的起始指針 i 開始左移,縮小窗口長度,注意可能存在左移后其子數組總和仍大于等于 target 的情況,所以此處判斷應該是 while 而不是 for,還需要將 i 原來指向的數值在 sum 中減掉。
  4. 窗口的起始指針 i 左移至窗口中的子數組不滿足條件時,此時需要結束指針 j 開始右移,直至窗口中的子數組再次滿足條件,即跳轉至第1步,當 j == nums.size() 時,表示數組內全部可能的子數組遍歷完成,返回結果。
  5. 最后同樣通過將初始長度設置為 INT32_MAXnums.size() + 1,判斷是否不存在符合條件的子數組,通過判斷結果是否被賦值,若未被賦值就返回0,說明沒有符合條件的子序列。
//時間復雜度:O(n)
//空間復雜度:O(1)
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int ans = nums.size() + 1;int sum = 0;for(int i = 0, j = 0; j < nums.size(); j++){sum +=nums[j];//注意這里使用while,每次更新 i(起始位置),并不斷比較子序列是否符合條件while(sum >= target){int count = j - i + 1; //取子序列的長度if(count < ans){ans = count;}//ans = ans < count ? ans : count;//這里體現出滑動窗口的精髓之處,不斷變更i(子序列的起始位置)sum -= nums[i];i++;}}//如果ans沒有被賦值的話,就返回0,說明沒有符合條件的子序列if(ans == nums.size() + 1) return 0;else return ans;//return ans == (nums.size() + 1) ? 0 : ans;}
};

關于時間復雜度,不要以為for里放一個while就以為是O(n^2), 主要是看每一個元素被操作的次數,每個元素在滑動窗后進來操作一次,出去操作一次,每個元素都是被操作兩次,所以時間復雜度是 2 × n 也就是O(n)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/710811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

傳輸層兩大戰將TCP、UDP的定位

傳輸層 定義一些傳輸數據的協議和端口&#xff0c;傳輸協議同時進行流量控制&#xff0c;根據接收方的數據吞入熟讀&#xff0c;規定適當的發送速率&#xff0c;解決傳輸效率及能力問題 什么是TCP TCP/IP即傳輸控制/網絡協議&#xff0c;是面向連接的協議&#xff0c;發送數…

什么是IP公網?

IP公網是指互聯網上可以公開訪問的IP地址。它是經過互聯網服務提供商&#xff08;ISP&#xff09;向用戶提供的公共網絡IP地址。與之相對的是內網IP地址&#xff0c;內網IP地址一般是由路由器或交換機分配給連接在局域網中的設備使用。 IP公網的作用非常廣泛&#xff0c;可以應…

C#解析JSON

https://blog.csdn.net/weixin_43046974/article/details/131449900 C#解析JSON 1. JSON定義2. JSON一般構成及解析方法3. 解析舉例子 1. JSON對象解析&#xff0c;只包含一層對象{}2. 嵌套JSON對象解析&#xff0c;包含多層對象{}3. JSON數組解析1&#xff08;數組循環遍歷&…

Web APIs知識點講解(階段二)

DOM-事件基礎 一.事件 1.事件 目標&#xff1a;能夠給 DOM元素添加事件監聽 事件:事件是在編程時系統內發生的動作或者發生的事情&#xff0c;比如用戶在網頁上單擊一個按鈕 事件監聽:就是讓程序檢測是否有事件產生&#xff0c;一旦有事件觸發&#xff0c;就立即調用一個函…

http工具類

public class HttpRequstUtil {/*** http請求方法** param message 查詢條件* param url 查詢地址* param token 身份驗證token* param socketTimeout socket 響應時間* param connectTimeout 超時時間* return 返回字符串*/Deprecatedpublic stat…

金仕達與 DolphinDB 建立深度合作,共筑 FICC 科技創新新篇章

從“關起門做交易”到“打開門做服務”&#xff0c;國內 FICC 業務正經歷從自營到市場化服務的轉變&#xff0c;借助數據分析、算法交易等技術的快速發展&#xff0c;交易團隊能夠更加主動地發現市場需求&#xff0c;為不同客群提供更好的做市業務&#xff0c;FICC 交易電子化已…

打造智能汽車微服務系統平臺:架構的設計與實現

隨著智能汽車技術的飛速發展&#xff0c;微服務架構在汽車行業中的應用越來越廣泛。采用微服務架構可以使汽車系統更加靈活、可擴展&#xff0c;并且有利于快速推出新功能和服務。本文將從設計原則、關鍵技術、數據安全等方面&#xff0c;介紹如何搭建智能汽車微服務系統平臺架…

網絡通信技術

?1.分組交換技術 在網絡通信中&#xff0c;數據通過網絡節點的某種轉發方式&#xff0c;實現從一個端系統到另一個端系統之間的數據傳輸技術稱為數據交換技術。數據交換技術有電路交換、報文交換和分組交換&#xff0c;計算機網絡采用分組交換技術。 分組就是源主機(如服務器…

【Python】FastAPI 項目創建 與 Docker 部署

文章目錄 前言&需求描述1. 本地FastAPI1.1 Python 環境準備1.2 本地 Pycharm 創建FastAPI項目 2. Python FastAPI 部署2.1 服務器配置Python環境2.2.1 下載與配置Git、Pyenv等工具2.2.2 下載與配置Python 2.2 FastAPI 打包成鏡像2.2.1 項目準備所需環境文件2.2.2 編寫Docke…

畢業設計——基于springboot的聊天系統設計與實現(服務端 + 客戶端 + web端)

整個工程包含三個部分&#xff1a; 1、聊天服務器 聊天服務器的職責一句話解釋&#xff1a;負責接收所有用戶發送的消息&#xff0c;并將消息轉發給目標用戶。 聊天服務器沒有任何界面&#xff0c;但是卻是IM中最重要的角色&#xff0c;為表達敬意&#xff0c;必須要給它放個…

入侵和攻擊模擬 (BAS) 技術應用實踐

文章目錄 前言一、實施BAS的必要性二、實施BAS的關鍵步驟1、識別網絡中的脆弱區域2、創建基線安全模型3、選擇合適的BAS工具4、進行模擬攻擊測試5、分析結果并改進三、BAS實施中的挑戰1、組織的專業知識和能力有限2、改變傳統工作流程3、安全預算不足4、難以與現有安全基礎設施…

C語言中的不同變量初始值:深度解析與實踐指南

在C語言編程領域&#xff0c;理解和掌握變量的初始化原理和過程是構建穩健、高效代碼的基礎。C語言對不同類型變量的初始化處理方式存在差異&#xff0c;這要求開發者明確理解并合理應用這些規則以避免潛在的運行時錯誤和未定義行為。本文將詳細解讀C語言中各類變量的初始狀態設…

AI智能分析網關V4車輛違停算法在園區場景中的應用及特點

隨著城市化進程的加速&#xff0c;車輛違停問題愈發嚴重&#xff0c;給城市交通帶來了極大的困擾。為了解決這一問題&#xff0c;AI技術逐漸被應用于車輛違停的檢測中。AI檢測算法在車輛違停方面的應用&#xff0c;主要是通過計算機視覺技術&#xff0c;對道路上的車輛進行實時…

智慧灌區項目案例(甘肅省蘭州市某重點灌區)

?甘肅省蘭州市某重點灌區自上個世紀80年代建成后,灌溉面積達到30萬畝,對推動當地農業發展發揮了重要作用。但長期以來,該灌區的水利管理仍主要依靠人工統計記錄,缺乏實時監測和精細化管理。為實現灌區管理的現代化升級,甘肅水利局委托星創易聯公司設計實施水利信息化項目。 項…

【Python筆記-設計模式】狀態模式

一、說明 狀態模式是一種行為設計模式&#xff0c;用于解決對象在不同狀態下具有不同行為 (一) 解決問題 在對象行為根據對象狀態而改變時&#xff0c;規避使用大量的條件語句來判斷對象的狀態&#xff0c;提高系統可維護性 (二) 使用場景 當對象的行為取決于其狀態&#…

C#使用iText7將多個PDF文檔合并為單個文檔

使用HtmlAgilityPack抓取并分析網頁內容&#xff0c;然后再調用PuppeteerSharp將網頁生成PDF文件&#xff0c;最終的成果如下圖所示&#xff0c;得到將近120個pdf文檔。能看&#xff0c;但是不方便&#xff0c;需要逐個打開文檔才能看到所需的內容&#xff0c;最好能將這些文檔…

淺談 Linux 網絡編程 socket

文章目錄 socket 介紹 socket 介紹 socket 被翻譯成 網絡套接字&#xff0c;這個名字實在是不好理解&#xff0c;我更愿意稱為"插槽"。 忽略 socket 的中文名&#xff0c;先無腦記住兩個規則&#xff1a; ① 記住&#xff0c;一個文件描述符(fd) 指向一個 socket&…

GPT-SoVITS音色克隆-模型訓練步驟

GPT-SoVITS音色克隆-模型訓練步驟 GPT-SoVITS模型源碼一個簡單的TTS后端項目 基于模型部署和訓練教程&#xff0c;語雀 模型部署和訓練教程 啟動模型訓練的主頁面 1. 切到模型路徑 /psycheEpic/GPT-SoVITS進入Python虛擬環境&#xff0c;并掛起執行python腳本 conda activ…

機器學習(II)--樣本不平衡

現實中&#xff0c;樣本&#xff08;類別&#xff09;樣本不平衡&#xff08;class-imbalance&#xff09;是一種常見的現象&#xff0c;如&#xff1a;金融欺詐交易檢測&#xff0c;欺詐交易的訂單樣本通常是占總交易數量的極少部分&#xff0c;而且對于有些任務而言少數樣本更…

Linux信號【產生-保存-處理】

目錄 前言&#xff1a; 1、進程信號基本概念 1.1、什么是信號&#xff1f; 1.2、信號的作用 2、鍵盤鍵入 2.1、ctrlc 終止前臺進程 2.1.1、signal 注冊執行動作 3、系統調用 3.1、kill 函數 3.2、模擬實現 myKill 3.3、raise 函數 3.4、abort 函數 4、軟件條件信號…