算法 雙指針技巧

文章目錄

  • 雙指針
  • [leetcode167 兩數之和](https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/description/)
    • 分析
    • 題解
  • [leetcode88 合并兩個有序數組](https://leetcode.cn/problems/merge-sorted-array/description/)
    • 分析
    • 題解
  • [leetcode142 環形鏈表](https://leetcode.cn/problems/linked-list-cycle-ii/description/)
    • 分析
    • 非公式分析
    • 題解
  • [leetcode76 最小覆蓋子串](https://leetcode.cn/problems/minimum-window-substring/)
    • 分析
    • 題解

雙指針

雙指針用于處理數組和鏈表等線性結構。同時用2個指針遍歷有序的數據結構,減少時間復雜度。

leetcode167 兩數之和

分析

由于數組是有序的,因此兩個指針,一個從前向后遍歷,一個從后往前遍歷,可以在O(n)時間復雜度完成查詢。
假設結果為[i, j]。那么左指針遍歷到i時,如果右指針大于j,那么和偏大,右指針左移,不會出現左指針右移的情況。直到右指針走到j,返回結果。右指針遍歷到j也是同理,因此不會出現左指針大于i,右指針小于j的情況。

題解

class Solution {public int[] twoSum(int[] numbers, int target) {int first = 0; // 第一個指針int last = numbers.length - 1;  // 第二個指針while (first < last) {int sum = numbers[first] + numbers[last];if (sum == target) {return new int[]{first + 1, last + 1};} else if (sum < target) {first++;} else {last--;}}return new int[]{-1, -1};}
}

leetcode88 合并兩個有序數組

分析

2個有序數組,每個數組用一個指針遍歷。因為合并結果存在nums1數組,而nums1數組的前半部分有值,后半部分是空的。所以與正向雙指針相比,逆向雙指針更快。

題解

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int tail = m + n - 1;int i = m - 1; // 第一個指針int j = n - 1; // 第二個指針int cur;while (i >= 0 || j >= 0) {if (i < 0) {cur = nums2[j];j--;} else if (j < 0) {cur = nums1[i];i--;} else if (nums1[i] > nums2[j]) {cur = nums1[i];i--;} else {cur = nums2[j];j--;}nums1[tail] = cur;tail--;}}
}

leetcode142 環形鏈表

分析

在這里插入圖片描述
假設slow指針和fast指針均從head節點出發,每次slow移動1個節點,fast移動2個節點。它們相遇時的位置如圖。a表示頭節點到入環點的距離,b表示入環點到相遇點的距離,c表示相遇點到入環點的距離。
slow = a + b, fast = a + n(b + c) + b
其中n表示fast節點在環中多走的次數。
fast = 2 * slow,則
a + n(b + c) + b = 2(a + b),變換得到
(n - 1)(b + c) + c = a,這個等式意味著,分別從相遇點出發和從頭結點出發的兩個節點終會在入環點相遇。

非公式分析

現在fast和slow在相遇點相遇,slow走過的距離是x。此時再來一個節點ptrslow的速度從頭結點走到相遇點,走過的距離也是x。那么slow在這期間走過的距離是多少?是2x,恰好是之前fast走過的距離。ptrslow相遇的位置恰好是slowfast相遇的位置。
由于slowptr在環里相遇,它們速度又相同,因此它們在環里的每個位置都相遇,自然包括入環點。

題解

public class Solution {public ListNode detectCycle(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {fast = fast.next.next; // 快指針slow = slow.next;  // 慢指針if (slow == fast) {fast = head; // 不浪費指針,fast表示ptrwhile (fast != slow) {fast = fast.next;slow = slow.next;}return fast;}}return null;}
}

leetcode76 最小覆蓋子串

分析

左右指針在同一個字符數組上,分別表示子串的左右邊界。由于要求最小子串,因此先用右指針保證覆蓋子串內容,再停止右指針并用左指針壓縮子串范圍。

題解

    public static String minWindow(String s, String t) {char[] sArray = s.toCharArray();char[] tArray = t.toCharArray();int[] cnt = new int[128];int count = 0;for (char c : tArray) {cnt[c]++;count++;}int start = -1;int end = sArray.length;int l = 0;for (int r = 0; r < sArray.length; r++) {if (--cnt[sArray[r]] >= 0) {count--;}while (count == 0) {if (++cnt[sArray[l]] > 0) {if (r - l < end - start) {end = r;start = l;}count++;}l++;}}return start == -1 ? "" : s.substring(start, end + 1);}
}

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

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

相關文章

DevOps工程技術價值流:制品庫Nexus與Harbor的實戰探索

制品庫作為DevOps價值流中的一個關鍵環節&#xff0c;其重要性日益凸顯。制品庫&#xff0c;作為存儲和管理軟件開發過程中產生的各種制品&#xff08;如代碼包、鏡像、配置文件等&#xff09;的倉庫&#xff0c;是連接開發、測試、部署等多個環節的橋梁。它不僅能夠實現制品的…

R9000P鍵盤失靈解決辦法

問題描述 突然&#xff0c;就是很突然&#xff0c;我買的R9000P 2024不到三個月&#xff0c;鍵盤突然都不能用了&#xff0c;是所有鍵盤按鍵都無效的那種。&#xff08;可以使用外接鍵盤&#xff09; 解決辦法 我本科室友說的好哈&#xff0c;全壞全沒壞。 &#xff08;該解…

潛在狄利克雷分配LDA 算法深度解析

引言 潛在狄利克雷分配&#xff08;Latent Dirichlet Allocation, LDA&#xff09;是一種廣泛應用于文本挖掘和信息檢索領域的主題模型。它能夠從文檔集合中自動發現隱藏的主題結構&#xff0c;為理解大規模文本數據提供了強有力的工具。本文將著重講解 LDA 的核心理論&#x…

使用正則表達式提取PDF文件頁數的實現方案

文章目錄 背景介紹實現原理代碼實現1. 基礎函數結構2. 頁數提取邏輯3. 使用示例 正則表達式解析優點與局限性優點局限性 錯誤處理建議性能優化建議最佳實踐建議總結參考資源 背景介紹 在Web應用開發中,我們經常需要獲取上傳PDF文件的頁數信息。雖然可以使用pdf.js等第三方庫,但…

sentinel學習筆記6-限流降級(上)

本文屬于sentinel學習筆記系列。網上看到吳就業老師的專欄&#xff0c;寫的好值得推薦&#xff0c;我整理的有所刪減&#xff0c;推薦看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 實現限流降級、熔斷降級、黑白名單限流降級、系統自適應…

全面解析 Kubernetes 流量負載均衡:iptables 與 IPVS 模式

目錄 Kubernetes 中 Service 的流量負載均衡模式 1. iptables 模式 工作原理 數據路徑 優點 缺點 適用場景 2. IPVS 模式 工作原理 數據路徑 優點 缺點 適用場景 兩種模式的對比 如何切換模式 啟用 IPVS 模式 驗證模式 總結 Kubernetes 中 Service 的流量負載…

每日十題八股-2024年12月19日

1.Bean注入和xml注入最終得到了相同的效果&#xff0c;它們在底層是怎樣做的&#xff1f; 2.Spring給我們提供了很多擴展點&#xff0c;這些有了解嗎&#xff1f; 3.MVC分層介紹一下&#xff1f; 4.了解SpringMVC的處理流程嗎&#xff1f; 5.Handlermapping 和 handleradapter有…

藍橋杯嵌入式備賽教程(1、led,2、lcd,3、key)

一、工程模版創建流程 第一步 創建新項目 第二步 選擇型號和管腳封裝 第三步 RCC使能 外部時鐘&#xff0c;高速外部時鐘 第四步晶振時鐘配置 由數據手冊7.1可知外部晶振頻率為24MHz 最后一項設置為80 按下回車他會自動配置時鐘 第五步&#xff0c;如果不勾選可能程序只會…

詳細解讀sedex驗廠

SEDEX驗廠&#xff0c;即供貨商商業道德信息交流認證&#xff08;Supplier Ethical Data Exchange&#xff09;&#xff0c;是一種表明企業遵守商業道德的認證。以下是對SEDEX驗廠的詳細解讀&#xff1a; 一、SEDEX驗廠概述 SEDEX是一家總部位于英國倫敦的非營利組織&#xf…

2.4 設備管理

文章目錄 設備管理概述設備管理技術磁盤調度 設備管理概述 設備管理是操作系統中最繁雜、與硬件關系緊密的部分。 設備可以按照數據組織、資源分配、數據傳輸率分類。 數據組織&#xff1a;分為塊設備&#xff08;ex. 磁盤&#xff09;、字符設備(ex. 打印機)。資源分配&#…

網絡安全滲透有什么常見的漏洞嗎?

弱口令與密碼安全問題 THINKMO 01 暴力破解登錄&#xff08;Weak Password Attack&#xff09; 在某次滲透測試中&#xff0c;測試人員發現一個網站的后臺管理系統使用了非常簡單的密碼 admin123&#xff0c;而且用戶名也是常見的 admin。那么攻擊者就可以通過暴力破解工具&…

PSDK的編譯與ROS包封裝

本文檔講述在NIVIDIA開發板上使用大疆提供的Payload SDK獲取無人機實時GPS信息的方法&#xff0c;以及基于Payload SDK發布ROS GPS話題信息的方法。 文章目錄 0 實現目標1 Payload SDK1.1 PSDK 源碼的編譯1.2 PSDK 的使用 2 遙測數據的讀取2.1 示例代碼結構2.2 讀取機載GPS信息…

模型 課題分離

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思維模型目錄。明確自我與他人責任。 1 課題分離的應用 1.1課題分離在心理治療中的應用案例&#xff1a;李曉的故事 李曉&#xff0c;一位28歲的軟件工程師&#xff0c;在北京打拼。他面臨著工作、家庭和感情的多重…

1222面經

1&#xff0c;Kafka 如何保障順序消費? Kafka 保障順序消費主要通過以下幾個關鍵機制和配置來實現&#xff1a; 分區策略 Kafka 將主題劃分為多個分區&#xff0c;每個分區內的消息是天然有序的&#xff0c;其按照消息發送到分區的先后順序進行存儲和追加。生產者在發送消息…

sed命令中單引號的處理

sed中’‘之間的單引號&#xff08;即單引號之間的單引號字符&#xff09;&#xff0c;特殊處理需要’“”’ &#xff08;兩個單引號中兩個雙引號再最里面是目標一個單引號&#xff09; 比如&#xff1a; sed -i s#<a id""img_logo"" href"http…

語音增強的損失函數選擇

一、最優尺度不變信噪比&#xff08;OSISNR&#xff09;損失函數 參考&#xff1a;論文解讀 --Optimal scale-invariant signal-to-noise ratio and curriculum learning for monaural multi-spea ??最優尺度不變信噪比&#xff08;OSI-SNR&#xff09;是一種用于評估信號質量…

【置信區間】之Python實現

置信區間是統計學中的一個核心概念,用于估計總體參數(如均值、比例等)的取值范圍。以下是對置信區間的詳細解釋: 一、定義與基本概念 定義:置信區間是指由樣本統計量所構造的總體參數的估計區間。它給出了參數真實值有一定概率落在該區間內的范圍,反映了測量值的可信程度…

大恒相機開發(3)—大恒相機工業檢測的實際案例

大恒相機工業檢測的實際案例 工業檢測的實際案例圖像采集性能優化技巧工業環境下的穩定性 工業檢測的實際案例 以下是一些使用大恒相機進行工業檢測的實際案例&#xff1a; 多特征光學成像系統&#xff1a; 在這個案例中&#xff0c;使用大恒相機構建了一個全方位、多特征的圖…

Java基礎面試題20:Java語言sendRedirect()和forward()方法有什么區別?

Java基礎面試題&#xff1a;Java語言sendRedirect()和forward()方法有什么區別&#xff1f; 在 Java Web 開發中&#xff0c;sendRedirect() 和 forward() 是兩個非常常用的方法&#xff0c;但它們有一些核心區別。我們來用最簡單的方式給你解釋清楚。 一、sendRedirect() 和 …

go官方日志庫帶色彩格式化

go默認的 log 輸出的日志樣式比較難看&#xff0c;所以通過以下方式進行了美化和格式化&#xff0c;而且加入了 unicode 的ascii碼&#xff0c;進行色彩渲染。 package mainimport ("fmt""log""os""runtime""strings""…