日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

指针 是否相同_算法一招鲜——双指针问题

發(fā)布時間:2024/9/27 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 指针 是否相同_算法一招鲜——双指针问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是雙指針(對撞指針、快慢指針)

雙指針,指的是在遍歷對象的過程中,不是普通的使用單個指針進(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è)向中間遍歷。所以解題思路如下:

  • 對給定數(shù)組進(jìn)行升序排序
  • 初始化左右指針
  • 每次都用一個”最重的“和一個”最輕的“進(jìn)行配對,如果二人重量小于Limit,則此時的”最輕的“上船,即(left++)。不管”最輕的“是否上船,”最重的“都要上船,即(right--)并且所需船數(shù)量加一,即(num++)
  • 代碼如下:

    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。