1. 程式人生 > >演算法與資料結構基礎 - 雙指標(Two Pointers)

演算法與資料結構基礎 - 雙指標(Two Pointers)

雙指標基礎

雙指標(Two Pointers)是面對陣列、連結串列結構的一種處理技巧。這裡“指標”是泛指,不但包括通常意義上的指標,還包括索引、迭代器等可用於遍歷的遊標。 

 

同方向指標

設定兩個指標、從頭往尾(或從尾到頭)遍歷,我稱之為同方向指標,第一個指標用於遍歷,第二個指標滿足一定條件下移動。例如 LeetCode題目 283. Move Zeroes:

    // 283. Move Zeroes
    void moveZeroes(vector<int>& nums) {
        int i=0;
        for(int j=0;j<nums.size();j++){
            if(nums[j]!=0) nums[i++]=nums[j];
        }
        while(i<nums.size()) nums[i++]=0;
    }

 

相關LeetCode題:

283. Move Zeroes  題解

26. Remove Duplicates from Sorted Array  題解

80. Remove Duplicates from Sorted Array II  題解

349. Intersection of Two Arrays  題解

350. Intersection of Two Arrays II  題解

925. Long Pressed Name  題解

88. Merge Sorted Array  題解

844. Backspace String Compare  題解

86. Partition List  題解

986. Interval List Intersections  題解

209. Minimum Size Subarray Sum  題解

713. Subarray Product Less Than K  題解

826. Most Profit Assigning Work  題解

930. Binary Subarrays With Sum  題解

838. Push Dominoes  題解

 

滑動視窗(Sliding Windows)也屬於同方向指標,關於滑動視窗詳見:

演算法與資料結構基礎 - 滑動視窗(Sliding Window)

 

快慢指標

若雙指標以固定步長移動,如第一個指標移動兩步、第二個指標移動一步,這種我們稱之為快慢指標。快慢指標常用於單向連結串列環(Cycle)判斷、Loop判斷等問題。

 

相關LeetCode題:

19. Remove Nth Node From End of List  題解

141. Linked List Cycle  題解

142. Linked List Cycle II  題解

234. Palindrome Linked List  題解

457. Circular Array Loop  題解

287. Find the Duplicate Number  題解

 

反方向指標

若雙指標其中一個從頭開始、另一個從尾開始,兩者往中間遍歷,這種使用方法我稱之為反方向指標。例如常見的反轉字串問題 LeetCode 344. Reverse String:

    // 344. Reverse String 
    void reverseString(vector<char>& s) {
        int i=0,j=s.size()-1;
        while(i<j) swap(s[i++],s[j--]);
    }

 

相關LeetCode題:

344. Reverse String  題解

125. Valid Palindrome  題解

345. Reverse Vowels of a String  題解

61. Rotate List  題解

75. Sort Colors  題解

1093. Statistics from a Large Sample  題解

11. Container With Most Water  題解

42. Trapping Rain Water  題解

 

應用於有序數列

一些情況下先對陣列排序,利用有序這個性質來判別雙指標怎麼移動,例如 LeetCode題目 15. 3Sum:

            // 15. 3Sum
int l=i+1, r=nums.size()-1; while(l<r){ int tmp=nums[i]+nums[l]+nums[r]; if(tmp>0) r--; else if(tmp<0) l++; …… }

 

相關LeetCode題:

977. Squares of a Sorted Array  題解

360. Sort Transformed Array  題解

532. K-diff Pairs in an Array  題解

881. Boats to Save People  題解

167. Two Sum II - Input array is sorted  題解

15. 3Sum  題解

16. 3Sum Closest  題解

259. 3Sum Smaller  題解

923. 3Sum With Multiplicity  題解

18. 4Sum  題解

&n