算法,蒜鳥蒜鳥-P1-理解“雙指針”

歡迎來到啾啾的博客🐱。
記錄學習點滴。分享工作思考和實用技巧,偶爾也分享一些雜談💬。
有很多很多不足的地方,歡迎評論交流,感謝您的閱讀和評論😄。

博客頭像3.0.png

目錄

  • 引言
  • 1 雙指針:Two Pointers
    • 1.1 左右指針
    • 1.2 滑動窗口

引言

在刷完代碼隨想錄、了解了基本的數據結構后,讓我們學算法(時隔四個月了)。
閱讀本篇可對基礎的雙指針算法有深入理解。

簡單來說,解決算法問題我們可以遵循一些簡單的模板,確認步驟、找合適的數據結構,解。

1 雙指針:Two Pointers

  1. 什么是“雙指針”模式?它主要想解決什么問題?

雙指針核心是減少遍歷,優化時間復雜度。
主要是為了將暴力解法中 O(n2) 的時間復雜度(兩層循環)優化到 O(n)(一層循環)。它本身就是一種 O(n) 的解法。

  1. “左右指針”和“快慢指針”這兩種方法,在使用場景上最大的區別是什么?(比如,一個通常用在什么數據結構上,另一個用在什么上?一個對原始數據有什么要求?)

左右指針主要適用于有序數組(不是非要有序數組),適用于搜索精確值。
快慢指針核心在于利用速度差來解決問題,用來解決數據結構中位置和環路的問題。
最經典的應用場景是鏈表,而不是數組。

1.1 左右指針

左右指針主要使用與有序數組,也通用于數組。
因為左右指針的條件判斷對于位置信息有要求,需要有效移動位置。

LeetCode:
125. 驗證回文串
簡單的回文字符串判斷。利用雙指針快速遍歷,優化時間復雜度。

11. 盛最多水的容器
明白移動短板是收益最高的選項后,利用雙指針移動短板。
這里除了雙指正還需要注意的是,我們寫解答時,要盡量分開狀態處理和狀態轉移。

  • 錯誤示例
class Solution {/**移動短板,因為短板沒有潛力了*/public int maxArea(int[] height) {int length = height.length;int left = 0;int right =length-1;int currentArea = Math.min(height[left],height[right]) * ( right-left);;while(left < right){if(height[left] < height[right]){left ++;}else{right --;}int tempArea = Math.min(height[left],height[right]) * ( right-left);currentArea = tempArea > currentArea? tempArea:currentArea;}return currentArea;}
}
  • 正確示例
class Solution {public int maxArea(int[] height) {int maxArea = 0;int left = 0;int right = height.length - 1;while (left < right) {// 1. 先用當前的 left 和 right 計算面積int currentWidth = right - left;int currentHeight = Math.min(height[left], height[right]);int currentArea = currentWidth * currentHeight;// 2. 更新歷史最大面積maxArea = Math.max(maxArea, currentArea);// 3. 然后再根據短板移動指針,為下一次循環做準備if (height[left] < height[right]) {left++;} else {right--;}}return maxArea;}
}

這樣修改后,循環體內部的邏輯非常純粹:對于當前的?left?和?right?狀態,我們先計算它的面積并更新?maxArea,然后再決定下一步怎么走。每一步都處理一個獨立的狀態,非常清晰。

1.2 滑動窗口

滑動窗口模式,顧名思義,就像有一個大小可變的“窗口”在一個序列(通常是數組或字符串)上滑動。它也是用兩個指針來定義的,通常我們叫它們?left?和?right,但這里的?left?和?right?都從起點開始,共同構成一個窗口?[left, right)?或?[left, right]

這個模式專門用來解決“連續子數組”或“連續子字符串”的相關問題,例如:

  • 找到滿足某條件的最長/最短的連續子串。
  • 找到所有滿足某條件的連續子數組的數量。

和左右指針定初始位置、判斷條件往相反的方向走不同。
滑動窗口是兩個指針相同一個方向移動:

  1. 窗口擴大:?不斷移動?right?指針,讓新的元素進入窗口。
  2. 更新狀態:?每當新元素進入,就更新窗口內的信息(例如:窗口內元素的和、不同字符的數量等)。
  3. 判斷收縮:?當窗口內的狀態不再滿足題目要求時(或者說,滿足了收縮條件時),就需要移動?left?指針,將元素移出窗口,這個過程叫作窗口收縮
  4. 持續收縮:?持續移動?left?指針,直到窗口內的狀態再次滿足題目要求
  5. 重復以上過程,直到?right?指針到達序列末尾。

3. 無重復字符的最長子串

import java.util.HashSet;
import java.util.Set;class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length();if (n == 0) {return 0;}// 1. 初始化Set<Character> charSet = new HashSet<>();int maxLen = 0;int left = 0; // 窗口左邊界int right = 0; // 窗口右邊界// 2. 循環,讓 right 指針作為主導,探索整個字符串while (right < n) {// 3. 嘗試擴大窗口:檢查 right 指向的字符是否已在窗口中char charToadd = s.charAt(right);// 4. 如果有重復,觸發窗口收縮//    注意這里是 while 循環,因為可能需要收縮多次while (charSet.contains(charToadd)) {// 從 Set 中移除 left 指向的字符charSet.remove(s.charAt(left));// 收縮窗口left++;}// 5. 此時窗口內一定沒有重復了,可以安全地加入新字符charSet.add(charToadd);// 6. 更新最大長度//    每一次擴大窗口后,都計算一下當前長度,并嘗試更新最大值maxLen = Math.max(maxLen, right - left + 1);// 7. 真正地擴大窗口,為下一次循環做準備right++;}return maxLen;}
}

還有209. 長度最小的子數組。

拓展:leetcode題解與題目匯總:powcai滑動窗口題解

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

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

相關文章

使用cookiecutter創建python項目

一、關于Python項目結構Python 項目并沒有完全統一的 “固定結構”&#xff0c;但行業內有一些廣泛遵循的約定俗成的目錄結構&#xff08;尤其針對可分發的包或大型項目&#xff09;。同時&#xff0c;確實有工具可以快速生成這些標準化結構&#xff0c;提高開發效率&#xff0…

臺積電生態工程深度解析:從晶圓廠到蜂巢的系統架構遷移

當半導體巨頭將工廠視為生態系統&#xff0c;用工程思維解決環境問題概述&#xff1a;生態系統的工程化再造臺積電近日開展的"積蜜"項目絕非簡單的企業CSR行為&#xff0c;而是一場將生態系統視為復雜系統進行工程化改造的技術實踐。本文將從系統架構、數據監控、循環…

從零實現一個簡易計算器

最近在刷算法題時&#xff0c;遇到了實現計算器的問題。一開始覺得很簡單&#xff0c;但真正動手實現時才發現其中有很多細節需要考慮。今天就來分享一下我的實現思路和學到的經驗。問題分析我們需要實現一個能夠處理加減乘除四則運算的計算器&#xff0c;要正確處理運算符的優…

Actix-webRust Web框架入門教程

文章目錄引言Actix-web是什么&#xff1f;準備工作你的第一個Actix-web應用理解代碼結構處理請求和響應接收請求數據返回響應中間件 - 增強你的應用狀態管理和依賴注入實用示例&#xff1a;構建RESTful API測試你的Actix-web應用部署Actix-web應用結語額外資源引言 嘿&#xf…

若依框架前端通過 nginx docker 鏡像本地運行

1. 前言 項目運行過程圖&#xff1a;對于前端項目通過命令 npm run build 打包后&#xff0c;無法直接運行。存在如下錯誤&#xff1a;可以通過配置 nginx 服務器運行前端項目解決如上問題。 2. Nginx 運行 采用 docker 鏡像的方式運行&#xff0c;docker-compose.yml 文件內容…

淺聊一下HTTP協議

在日常上網瀏覽網頁、刷視頻時&#xff0c;背后都離不開 HTTP 協議的支持。作為 Web 世界的 “交通規則”&#xff0c;它負責服務器和客戶端瀏覽器之間的數據傳輸。這篇文章就帶大家全面了解 HTTP 協議&#xff0c;從基本概念到通信細節&#xff0c;再到安全相關的 HTTPS&#…

機器人控制器開發(定位——cartographer ros2 使用2)

文章總覽 1 純定位模式 當完成建圖后&#xff0c;會生成pbstream格式的地圖文件 配置純定位模式的lua腳本 backpack_2d_localization.lua include "backpack_2d.lua"TRAJECTORY_BUILDER.pure_localization_trimmer {max_submaps_to_keep 3, } POSE_GRAPH.optimi…

《大數據之路1》筆記3:數據管理

一 元數據 1.1 元數據概述 定義&#xff1a; 元數據是關于數據的數據&#xff0c;元數據打通了源數據、數據倉庫、數據應用&#xff0c;記錄了數據從生產到消費的全部過程。元數據主要記錄數據倉庫中模型的定義、各層級間的映射關系、監控數據倉庫的數據狀態和ETL的任務運行狀態…

排序實現java

排序算法概述Java中實現排序可以通過多種方式&#xff0c;包括內置方法、自定義算法或使用第三方庫。常見的排序算法有冒泡排序、選擇排序、插入排序、快速排序、歸并排序等。使用Arrays.sort()方法對于數組排序&#xff0c;Java提供了Arrays.sort()方法&#xff0c;支持對基本…

51c大模型~合集182

我自己的原文哦~ https://blog.51cto.com/whaosoft/14174587 #LaV-CoT 超越GPT-4o&#xff0c;螞蟻集團與南洋理工大學提出&#xff1a;首個語言感知的視覺思維鏈 隨著大型視覺語言模型&#xff08;VLM&#xff09;的飛速發展&#xff0c;它們在處理復雜的視…

C++ STL之deque的使用和模擬實現

目錄 deque 核心本質與定位 與stack和queue的關系: deque的使用 deque的底層實現 deque的原理介紹 deque的缺陷 總結: deque deque文檔 : deque 翻譯: 雙端隊列 deque&#xff08;通常發音類似“deck”&#xff09;是“double-ended queue”&#xff08;雙端隊列&…

布草洗滌廠設備租賃押金原路退回系統—東方仙盟

設備租賃狀態設備管理添加設備設備收押金設備退押金在布草洗滌行業的運營版圖中&#xff0c;設備租賃是連接廠商與客戶的重要紐帶&#xff0c;而押金的收取與退還則是這一環節中關乎信任與效率的關鍵節點。未來之窗布草洗滌廠深諳此道&#xff0c;專為設備租賃業務打造的 “押金…

換源rocklinux和centos

一、Rockylinux換源&#xff0c;國外的源換成國內的源#nmcli connection modify ens33 ipv4.addresses 192.168.121.11 ipv4.gateway 192.168.121.2 ipv4.method manual ipv4.dns 114.114.114.114 connection.autoconnect yes修改地址#systemctl stop firewalld#systemctl diab…

第一部分:服務器硬件配置

目錄1.1 服務器上架與連線1.2 啟用CPU虛擬化功能&#xff08;BIOS設置&#xff09;1.3 配置RAID存儲步驟1&#xff1a;進入RAID配置界面步驟2&#xff1a;確認RAID控制器信息步驟3&#xff1a;創建系統RAID&#xff08;用于安裝ESXi&#xff09;步驟4&#xff1a;創建數據RAID&…

手搓一個 DELL EMC Unity存儲系統健康檢查清單

寫在前面對于DELL EMC存儲系統Unity的一些深度的健康檢查通過Web的Unisphere圖形化界面是做不到的&#xff0c;圖形化界面只能看到是否有告警&#xff0c;物理的東西是否有問題的&#xff0c;邏輯的Pool和LUN等是否ready&#xff0c;再深入的潛在的問題是查不到的。另外&#x…

【數據結構】二叉樹的概念

01 概念定義&#xff1a;二叉樹既然叫二叉樹&#xff0c;顧名思義即度最大為2的樹稱為二叉樹。 它的度可以為 1 也可以為 0&#xff0c;但是度最大為 2 。 一顆二叉樹是節點的一個有限集合&#xff0c;該集合&#xff1a;① 由一個根節點加上兩棵被稱為左子樹和右子樹的二叉樹組…

【RK3576】【Android14】如何在Android14下單獨編譯kernel-6.1?

單獨編譯kernel依賴如下幾個源碼&#xff1a;【交叉編譯工具鏈】prebuilts/clang/host/linux-x86/clang-r487747c【內核源碼】kernel-6.1為什么Android下編譯內核使用clang作為交叉編譯工具鏈而不是GCC&#xff1f;Android 14 選擇使用預置的 Clang 工具鏈&#xff08;如 clang…

什么是Redis的Pipeline

介紹Redis的Pipeline是一種網絡優化技術&#xff0c;在沒有Pipeline的時候&#xff0c;客戶端往redis發送請求&#xff0c;客戶端需要等到redis響應之后才能發送下一個請求。而Pipeline&#xff0c;使redis可以一次性接收多個請求。減少了通信次數&#xff0c;顯著的提高了性能…

【ElementUI el-table跨頁勾選】

一、el-table需加上refs和 row-key屬性 二、type"selection"勾選框 需加上 reserve-selection儲備選擇屬性 三、在分頁請求數據時&#xff0c;觸發 setSelected()方法 四、在 selection-change變化時保存 selectedRows <el-table ref"tables" :data&quo…

論文閱讀/博弈論/拍賣:《Truthful Auction for Cooperative Communications》

摘要&#xff1a;一方面&#xff0c;協作通信由于其在提升無線網絡容量方面的巨大潛力而日益受到關注。另一方面&#xff0c;協作通信技術的實際應用卻很少見&#xff0c;即使在一些對帶寬需求極高的應用場景中&#xff0c;系統設計者也并未采用協作通信技術來開發創新的網絡解…