【算法】雙指針(下)

目錄

查找總價格為目標值的兩個商品

暴力解題

雙指針解題

三數之和

雙指針解題(左右指針)

四數之和

雙指針解題

雙指針關鍵點

注意事項


查找總價格為目標值的兩個商品

題目鏈接:LCR 179. 查找總價格為目標值的兩個商品 - 力扣(LeetCode)

題目描述

輸??個遞增排序的數組和?個數字 s ,在數組中查找兩個數,使得它們的和正好是 s 。如果有多

對數字的和等于 s ,則輸出任意?對即可。

?例 1:

輸?: nums = [2,7,11,15], target = 9

輸出: [2,7] 或者 [7,2]

暴力解題

class Solution {public static int[] twoSum(int[] price, int target) {int n=price.length;int[] array=new int[2];for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(price[i]+price[j]==target){array[0]=price[i];array[1]=price[j];return array;}}}return array;}
}

雙指針解題

解題思路:由于數組是升序的,我們可以使用【左右指針】,left和right指針分別指向最小值和最大值,判斷其和是否等于目標值target。相等的話則直接返回,結束遍歷

如果不相等,有兩種情況:

·和小于target:采取增大最小值,逐漸接近target。即left++

·和大于target:采取減小最大值,逐漸接近target。即right--

解題代碼

class Solution {public static int[] twoSum(int[] price, int target) {int[] array=new int[2];int n=price.length;int left=0;int right=n-1;while(left<right){int sum=price[left]+price[right];if(sum>target){right--;}else if(sum<target){left++;}else{array[0]=price[left];array[1]=price[right];return array;}}return array;}
}

三數之和

題目鏈接:15. 三數之和 - 力扣(LeetCode)

題目描述

給你?個整數數組 nums ,判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿? i != j、i != k 且 j

!= k ,同時還滿? nums[i] + nums[j] + nums[k] == 0 。請你返回所有和為 0 且不重復的三元組。

注意:答案中不可以包含重復的三元組。

?例 1:

輸?:nums = [-1,0,1,2,-1,-4]

輸出:[[-1,-1,2],[-1,0,1]]

解釋:

nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。

nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。

nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。

不同的三元組是 [-1,0,1] 和 [-1,-1,2] 。

注意,輸出的順序和三元組的順序并不重要。

?例 2:

輸?:nums = [0,1,1]

輸出:[]

解釋:唯?可能的三元組和不為 0 。

?例 3:

輸?:nums = [0,0,0]

輸出:[[0,0,0]]

解釋:唯?可能的三元組和為 0 。

提?:

3 <= nums.length <= 3000

-10^5 <= nums[i] <= 10^5

雙指針解題(左右指針)

題目分析:我們需要在數組中,找到滿足 和為0且不重復?的三元組

重點不重復

解題思路:既然是三元組,我們選擇固定一個元素temp,然后只需找到 【和為-temp的二元組】 即可

1.排序,并且固定最大值(假設下標為i):因為如果不排序,隨機固定一個元素,無法使用雙指針找到 【和為-nums[i]的二元組】。

2.找到 【和為-temp的二元組】:使用【左右指針】,left指針指向0,right指針指向?i?左側的位置

如下圖:

本題如何保證【不重復】呢?

·在找到一個【二元組】后,left和right指針需要【跳過重復】的元素:首先需要先跳過已找到的【二元組】,即left++,right--。其次,如果新的left、right處的元素與上一個【二元組】的數相同,也需要跳過。

·當使用完一次雙指針算法后,固定的i也要【跳過重復】的元素:即當left和right指針相遇后,i--之后(for循環實現),如果新的i處的元素與前一個i處的元素相等,需要額外的i--

假設最大值的下標為i,區間[left,right]是i位置左邊的區間--也就是比i小的區間:

如果nums[left]+nums[right]>-nums[i]:這時需要減小【較大值】(right--),嘗試接近-nums[i]

如果nums[left]+nums[right]<-nums[i]:這時需要增大【較小值】(left++),嘗試接近-nums[i]

優化:在尋找三數之和為0時,當三個數中最大的那個數小于0時,三數之和只能小于0。

解題代碼

class Solution {public static List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> arr=new ArrayList<>();Arrays.sort(nums);int n=nums.length-1;for(int i=n;i>=2;i--){if(nums[i]<0) break;int left=0;int right=i-1;while(left<right){int sum=nums[left]+nums[right];int target=-1*nums[i];if(sum>target){right--;}else if(sum<target){left++;}else{arr.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));left++;right--;while(left < right && nums[left] == nums[left - 1]) left++;while(left < right && nums[right] == nums[right + 1])right--;}}while(i>2&&nums[i]==nums[i-1])i--;}return arr;}
}

四數之和

題目鏈接:18. 四數之和 - 力扣(LeetCode)

題目描述

給你?個由 n 個整數組成的數組 nums ,和?個?標值 target 。請你找出并返回滿?下述全部條件

且不重復的四元組 [nums[a], nums[b], nums[c], nums[d]] (若兩個四元組元素??對應,則認為

兩個四元組重復):

? 0 <= a, b, c, d < n

? a、b、c 和 d 互不相同

? nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意順序 返回答案 。

?例 1:

輸?:nums = [1,0,-1,0,-2,2], target = 0

輸出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

?例 2:

輸?:nums = [2,2,2,2,2], target = 8

輸出:[[2,2,2,2]]

提?:

1 <= nums.length <= 200

-10^9 <= nums[i] <= 10^9

-10^9 <= target <= 10^9

題目分析:我們需要在數組中,找到滿足 和為target且不重復?的四元組

重點不重復(解決方法與三數之和類似,這里不進行闡述)

雙指針解題

解題思路:與三數之和類似。由于這里是【四元組】,我們選擇固定兩個元素。然后 只需使用【左右指針】,找到一個【二元組】使其與固定的兩個元素之和等于目標值(target)即可。

注意:由于?-10^9 <= nums[i] <= 10^9,當nums[i]+nums[j]+nums[left]+nums[right]時,這里可能會導致超出int類型的最大值,所以需要強制類型轉換為(long)

解題代碼

class Solution {
public static List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> arr=new ArrayList<>();Arrays.sort(nums);int n=nums.length;//固定一個最小值和一個最大值for(int i=0;i<n;i++){//去重while(i<n&&i!=0&&nums[i]==nums[i-1]) i++;for(int j=n-1;j>i;j--){//去重while(j>i&&j!=n-1&&nums[j]==nums[j+1]) j--;int left=i+1;int right=j-1;while(left<right){long sum=(long)nums[i]+nums[j]+nums[left]+nums[right];if(sum==target){arr.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));left++;right--;//去重while(left<right&&nums[left]==nums[left-1]) left++;while(left<right&&nums[right]==nums[right+1]) right--;}else if(sum>target){right--;}else{left++;}}}}return arr;}
}

雙指針關鍵點

1.初始化

通常,雙指針被初始化為指向數據結構(如數組)的開始和結束,或者根據問題的具體要求進行其他初始化

2.移動規則

指針的移動規則取決于要解決的問題。例如,在尋找有序數組中的兩數之和(如本章的第一題)時,如果當前兩數之和小于目標值,則左指針右移以增加和;如果大于目標值,則右指針左移以減小和

3.停止條件

當指針相遇或交叉,或者滿足問題的特定條件時,遍歷結束

4.空間復雜度

雙指針技術通常具有O(1)的額外空間復雜度,因為它只需要維護兩個指針的位置,而不需要額外的數據結構來存儲數據

注意事項

1.邊界條件:在使用雙指針時,要特別注意邊界條件,確保指針不會越界或指向無效的位置

2.指針的同步移動:根據問題的要求,指針可能需要同步移動(如同時向右移動),或者按照特定的規則異步移動(如一個指針固定,另一個指針移動)

3.問題的轉化:有時,將問題轉化為可以使用雙指針技術解決的形式才是關鍵。例如,通過排序將無序數組轉化為有序數組,從而可以應用雙指針技術。

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

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

相關文章

Windows 圖形顯示驅動開發-IoMmu 模型

輸入輸出內存管理單元 (IOMMU) 是一個硬件組件&#xff0c;它將支持具有 DMA 功能的 I/O 總線連接到系統內存。 它將設備可見的虛擬地址映射到物理地址&#xff0c;使其在虛擬化中很有用。 在 WDDM 2.0 IoMmu 模型中&#xff0c;每個進程都有一個虛擬地址空間&#xff0c;即&a…

軟件測評報告包括哪些內容?第三方軟件測評機構推薦

在當今信息技術飛速發展的時代&#xff0c;軟件的品質與性能直接影響到企業的運營效率和市場競爭力。為了確保軟件的可用性和可靠性&#xff0c;軟件測評成為一個不可或缺的環節&#xff0c;軟件測評報告也是對軟件產品進行全面評估后形成的一份文檔&#xff0c;旨在系統地紀錄…

深淺拷貝區別,怎么區別使用

在 JavaScript 中&#xff0c;深拷貝&#xff08;Deep Copy&#xff09; 和 淺拷貝&#xff08;Shallow Copy&#xff09; 是兩種不同的對象復制方式&#xff0c;它們的區別主要體現在對嵌套對象的處理上。以下是它們的詳細對比及使用場景&#xff1a; 1. 淺拷貝&#xff08;Sh…

tailscale + derp中繼 + 阿里云服務器 (無域名版)

使用tailscale默認的中轉節點延遲很高&#xff0c;因為服務器都在國外。 感謝大佬提供的方案&#xff1a;Tailscale 搭建derp中繼節點&#xff0c;不需要域名&#xff0c;不需要備案&#xff0c;不需要申請證書&#xff08;最新&#xff09; - yafeng - 博客園 基于這個方案&…

【異常錯誤】pycharm debug view變量的時候顯示不全,中間會以...顯示

異常問題&#xff1a; 這個是在新版的pycharm中出現的&#xff0c;出現的問題&#xff0c;點擊view后不全部顯示&#xff0c;而是以...折疊顯示 在setting中這么設置一下就好了&#xff1a; 解決辦法&#xff1a; https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…

【DeepSeek系列】04 DeepSeek-R1:帶有冷啟動的強化學習

文章目錄 1、簡介2、主要改進點3、兩個重要觀點4、四階段后訓練詳細步驟4.1 冷啟動4.2 推理導向的強化學習4.3 拒絕采樣和有監督微調4.4 針對所有場景的強化學習 5、蒸餾與強化學習對比6、評估6.1 DeepSeek-R1 評估6.2 蒸餾模型評估 7、結論8、局限性與未來方向 1、簡介 DeepS…

車載音頻配置(二)

目錄 OEM 自定義的車載音頻上下文 動態音頻區配置 向前兼容性 Android 14 車載音頻配置 在 Android 14 中,AAOS 引入了 OEM 插件服務,使你可以更主動地管理由車載音頻服務監督的音頻行為。 隨著新的插件服務的引入,車載音頻配置文件中添加了以下更改: ? OEM 自定義的車…

禁止WPS強制打開PDF文件

原文網址&#xff1a;禁止WPS強制打開PDF文件_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹如何避免WPS強制打開PDF文件。 方法 1.刪除注冊表里.pdf的WPS綁定 WinR&#xff0c;輸入&#xff1a;regedit&#xff0c;回車。找到&#xff1a;HKEY_CLASSES_ROOT\.pdf刪除KWPS.PDF…

深入解析NoSQL數據庫:從文檔存儲到圖數據庫的全場景實踐

title: 深入解析NoSQL數據庫:從文檔存儲到圖數據庫的全場景實踐 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通過電商、社交網絡、物聯網等12個行業場景,結合MongoDB聚合管道、Redis Stream實時處理、Cassandra SSTable存儲引擎、Neo4j路徑遍歷算法等42…

用 Biome 替代 ESLint 和 Prettier

簡介 ESLint 和 Prettier ESLint&#xff1a;代碼質量檢查工具&#xff0c;確保代碼風格一致與無錯誤 Prettier&#xff1a;代碼格式化工具&#xff0c;自動美化代碼布局 所以&#xff1a;ESLint Prettier 能自動美化代碼、自動檢查代碼錯誤的工具 Biome Biome&#xff1a;…

6.3 DBMS的功能和特征

文章目錄 DBMS的6大功能DBMS的3個特征DBMS的分類 DBMS的6大功能 DBMS包含數據定義&#xff0c;數據庫操作&#xff08;檢索、插入、修改、刪除&#xff09;&#xff0c;數據庫運行管理&#xff08;保證多用戶環境下正常運行&#xff09;&#xff0c;數據組織、存儲、管理&…

力扣hot100——找到字符串中的所有字母異位詞

給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 解法思路&#xff1a; 1. // 判斷字符相等&#xff0c;其實就是給定一個定長的窗口去滑動查找子串&#xff0c;為了便于判斷將p 與窗口中的子…

前端插件使用xlsx-populate,花樣配置excel內容,根據坐添加標替換excel內容,修改顏色,合并單元格...。

需求要求&#xff1a;業務人員有個非常復雜得excel表格&#xff0c;各種表頭等&#xff0c;但是模板是固定得。當然也可以實現在excel上搞出各種表格&#xff0c;但是不如直接用已有模板替換其中要動態得內容方便&#xff0c;這里我們用到CSDN得 xlsx-populate 插件。 實列中我…

未來AI方向落地場景:小語言模型,super_private_agent

未來AI方向落地場景:小語言模型,super_private_agent 目錄 未來AI方向落地場景:小語言模型,super_private_agent小語言模型super - private - agent(注重隱私的智能代理)碳基生命和硅基生命交互界面面向agent的專用交互協議和數據接口從web平臺經濟到網絡平臺舉例說明社交…

Coze扣子新功能詳解

今晚(2025-01-24)扣子再次進行更新 主要更新內容&#xff1a; 搭建小程序和 H5 用戶界面時&#xff0c;支持使用音頻組件播放音頻內容 數據庫操作體驗提升 界面優化&#xff1a;對數據庫詳情界面進行了重新設計&#xff0c;并將工作流運行數據庫的測試數據位置從原工作流底…

匯能感知的光譜相機/模塊產品有哪些?

CM020A 分辨率&#xff1a;1600H1200V 光譜范圍&#xff1a;350~950nm 光譜分辨率&#xff1a;1nm 接口&#xff1a;USB2.0 幀率&#xff1a;16001200 (6幀) 輸出格式&#xff1a;Raw 8bit FOV&#xff1a;D73.5H58.8V44.1 相機尺寸&#xff1a;505055mm VM02S10 分辨率…

Ollama 本地GUI客戶端:為DeepSeek用戶量身定制的智能模型管理與交互工具

Ollama 本地GUI客戶端&#xff1a;為DeepSeek用戶量身定制的智能模型管理與交互工具 相關資源文件已經打包成EXE文件&#xff0c;可雙擊直接運行程序&#xff0c;且文章末尾已附上相關源碼&#xff0c;以供大家學習交流&#xff0c;博主主頁還有更多Python相關程序案例&#xf…

OpenMv識別色塊通過串口發給STM32

硬件連接 1、Openmv端 這里OpenMV端僅作為數據的發送端,所以只需要共地,以及OpenMV的TX(P4)與開發板的RX端連接即可。 2、STM32端 將開發板連接STM芯片RX端與轉串口TX端的跳帽取下,再將OpenMV的TX端(P4)與STM的RX連接。如果使用USB轉TTL則將TTL的RX端與STM的TX端連接…

以太網交換基礎(涵蓋二層轉發原理和MAC表的學習)

在當今的網絡世界中&#xff0c;以太網交換技術是局域網&#xff08;LAN&#xff09;的核心組成部分。無論是企業網絡、學校網絡還是家庭網絡&#xff0c;以太網交換機都扮演著至關重要的角色。本文將詳細介紹以太網交換的基礎知識&#xff0c;包括以太網協議、幀格式、MAC地址…

菜鳥之路Day15一一IO流(一)

菜鳥之路Day15一一IO流&#xff08;一&#xff09; 作者&#xff1a;blue 時間&#xff1a;2025.2.8 文章目錄 菜鳥之路Day15一一IO流&#xff08;一&#xff09;0.概述1.初識IO流1.1.什么是IO流&#xff1f;1.2.IO流的作用1.3.IO流的分類 2.IO流的體系結構3.字節輸出流的基本…