用指標輸入一組字串 雙指標演算法各類題型總結

2021-10-11 14:03:59 字數 2582 閱讀 9079

雙指標,顧名思義,就是利用兩個指標去遍歷 陣列 & 鍊錶 & 字串,以達到所需實現的目標。

一般情況下,對於遍歷陣列只需要單個指標即可完成,但是在某些複雜情況下,用兩個指標來運算元據會更為快捷、高效。以下我會詳細介紹、對比三種常見的雙指標題型演算法,希望大家在閱讀完之後對該型別的題目能有深刻的認識!

對撞指標用於解決已排序的陣列問題,通過兩條指標反方向遍歷直至兩條指標相交,同時運算元組中的兩條資料,達到減少迴圈層數、降低時間複雜度的目的。

對撞指標遍歷一般是在有序陣列中使用,乙個放首,乙個放尾,同時向中間遍歷,直到兩個指標相交,完成遍歷。

leetcode 15 題:

三數之和

給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。

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

//舉個 

給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

};

滑動指標演算法思想可以用來解決陣列&字串的子元素等問題。它將巢狀迴圈的問題,轉換為單層迴圈問題,降低時間複雜度,提高效率。

它將兩個指標的區間範圍當作乙個滑塊,然後將這個視窗在陣列上滑動。在視窗滑動的過程中,左邊會出乙個元素,右邊會進乙個元素,然後計算對比當前視窗內的元素即可。

leetcode 209 題:長度最小的子陣列

給定乙個含有 n 個正整數的陣列和乙個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的連續子陣列,並返回其長度。如果不存在符合條件的連續子陣列,返回 0。

// 舉個 

輸入: s = 7, nums = [2,3,1,2,4,3]

輸出: 2

解釋: 子陣列 [4,3] 是該條件下的長度最小的連續子陣列。

};

構造陣列arr,然後用 min 來儲存陣列的長度,並對每次滿足條件的陣列長度進行比對 (滿足陣列之和sum ≥ s的while迴圈),最終得到最小的min。

快慢指標常用於處理資料的追擊問題,兩個指標進行同向運動,但是運動速度一快一慢,如果處理的資料出現迴圈時,快速指標 必將與慢速指標 相遇。

leetcode 141 題:環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。

輸入: 1 => 2 => 3 => 4 => 2

輸出: true

輸入:1 => 2 => 3 => 4

輸出:false

};

定義兩個變數(slow、fast指標)開始迴圈,快指標的速度是慢指標的兩倍,所以當他們相遇時,則鍊錶中存在環,或者快指標走到終點,說明鍊錶無環。

準備程式設計師面試?你需要了解這 14 種程式設計面試模式

字串的排列(雙指標)

先給題 給定兩個字串 s1 和 s2,寫乙個函式來判斷 s2 是否包含 s1 的排列。換句話說,第乙個字串的排列之一是第二個字串的子串。示例1 輸入 s1 ab s2 eidbaooo 輸出 true 解釋 s2 包含 s1 的排列之一 ba 示例2 輸入 s1 ab s2 eidboaoo 輸出 ...

17 21用指標鏈結字串

01.04.檔名稱 test.cpp 05.作 者 李曉凡 06.完成日期 2014年12月12日 07.版本號 v1.0 08.09.問題描述 用指標鏈結字串 10.輸入描述 11.程式輸出 兩個字串連線後的字串 12.include using namespace std char pstrca...

雙指標,KMP 實現字串定位

像我這種菜雞就喜歡用暴力的方法來求解,我這個方法實際上就是乙個字串乙個字串的比對,如果相同就進入迴圈乙個乙個字串進行比對,如果比對完全匹配就返回匹配結果反之。func strstr haystack string needle string int 字串比對開始位置 t 0 開始遍歷haystack...