指针 是否相同_算法一招鲜——双指针问题
什么是雙指針(對撞指針、快慢指針)
雙指針,指的是在遍歷對象的過程中,不是普通的使用單個指針進(jìn)行訪問,而是使用兩個相同方向(快慢指針)或者相反方向(對撞指針)的指針進(jìn)行掃描,從而達(dá)到相應(yīng)的目的。
換言之,雙指針法充分使用了數(shù)組有序這一特征,從而在某些情況下能夠簡化一些運(yùn)算。
在LeetCode題庫中,關(guān)于雙指針的問題還是挺多的。雙指針
截圖來之LeetCode中文官網(wǎng)用法
對撞指針
對撞指針是指在有序數(shù)組中,將指向最左側(cè)的索引定義為左指針(left),最右側(cè)的定義為右指針(right),然后從兩頭向中間進(jìn)行數(shù)組遍歷。
對撞數(shù)組適用于有序數(shù)組,也就是說當(dāng)你遇到題目給定有序數(shù)組時,應(yīng)該第一時間想到用對撞指針解題。偽代碼大致如下:
function fn (list) {var left = 0;var right = list.length - 1;//遍歷數(shù)組while (left <= right) {left++;// 一些條件判斷 和處理... ...right--;} }舉個LeetCode上的例子:
以LeetCode 881救生艇問題為例
由于本題只要求計算出最小船數(shù),所以原數(shù)組是否被改變,和元素索引位置都不考慮在內(nèi),所以可以先對于給定數(shù)組進(jìn)行排序,再從數(shù)組兩側(cè)向中間遍歷。所以解題思路如下:
代碼如下:
var numRescueBoats = function(people, limit) {people.sort((a, b) => (a - b));var num = 0let left = 0let right = people.length - 1while (left <= right) {if ((people[left] + people[right]) <= limit) {left++}right--num++}return num };快慢指針
快慢指針也是雙指針,但是兩個指針從同一側(cè)開始遍歷數(shù)組,將這兩個指針分別定義為快指針(fast)和慢指針(slow),兩個指針以不同的策略移動,直到兩個指針的值相等(或其他特殊條件)為止,如fast每次增長兩個,slow每次增長一個。
以LeetCode 141.環(huán)形鏈表為例,,判斷給定鏈表中是否存在環(huán),可以定義快慢兩個指針,快指針每次增長一個,而慢指針每次增長兩個,最后兩個指針指向節(jié)點(diǎn)的值相等,則說明有環(huán)。就好像一個環(huán)形跑道上有一快一慢兩個運(yùn)動員賽跑,如果時間足夠長,跑地快的運(yùn)動員一定會趕上慢的運(yùn)動員。
解題代碼如下:
/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*//*** @param {ListNode} head* @return {boolean}*/ var hasCycle = function(head) {if (head === null || head.next === null) {return false}let slow = headlet fast = head.nextwhile (slow !== fast) {if (fast === null || fast.next === null) {return false}slow = slow.nextfast = fast.next.next}return true };再比如LeetCode 26 刪除排序數(shù)組中的重復(fù)項,這里還是定義快慢兩個指針。快指針每次增長一個,慢指針只有當(dāng)快慢指針上的值不同時,才增長一個(由于是有序數(shù)組,快慢指針值不等說明找到了新值)。
真實代碼:
var removeDuplicates = function (nums) {if (nums.length === 0) {return 0;}let slow = 0;for (let fast = 0; fast < nums.length; fast++) {if (nums[fast] !== nums[slow]) {slow++;nums[slow] = nums[fast];}}return slow + 1; };總結(jié)
當(dāng)遇到有序數(shù)組時,應(yīng)該優(yōu)先想到雙指針來解決問題,因兩個指針的同時遍歷會減少空間復(fù)雜度和時間復(fù)雜度。
歡迎關(guān)注微信公眾號——【較真的前端
相關(guān)題目
- LeetCode.141.環(huán)形鏈表
- LeetCode.026.刪除數(shù)組中重復(fù)的項
- LeetCode.881.救生艇
參考文獻(xiàn)
- 《LeetBook》雙指針
- 【算法總結(jié)--數(shù)組相關(guān)】雙指針法的常見應(yīng)用。
- 1.4.2 雙指針技巧(二)
總結(jié)
以上是生活随笔為你收集整理的指针 是否相同_算法一招鲜——双指针问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 执行存储过程报语法错误_为什么
- 下一篇: 公需科目必须学吗_要考电工证吗?电工技术