刷題計畫 雙指標演算法(一)

2021-10-02 10:54:11 字數 3503 閱讀 6626

leetcode上的一些能用雙指標辦法解決的演算法題題解

86.分割鍊錶(中等)

題目:

給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。

你應當保留兩個分割槽中每個節點的初始相對位置。

示例:

輸入: head =1-

>4-

>3-

>2-

>5-

>

2, x =

3輸出:1-

>2-

>2-

>4-

>3-

>

5

此題的解法有二:

( 值交換法) 遍歷一遍鍊錶,在陣列super中記錄大於和等於x節點的數,在陣列lower中記錄小於節點x的數,再此遍歷該鍊錶並將陣列super和陣列lower 中的值賦值給鍊錶的節點

class

solution

temp = head;

// reset the temp as the start of list

for(

int i =

0; i < lower.

size()

;++i)

for(

int i =

0; i < super.

size()

;++i)

return head;}}

;

2.(節點交換法),遍歷一遍鍊錶,將小於x的節點構成鍊錶before,大於和等於x的節點構成鍊錶after,將鍊錶after 與 before相連,返回after的頭結點

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

else

head = head-

>next;

}

tmp1-

>next = after-

>next;

tmp2-

>next =

null

;return before-

>next;}}

;

19.刪除鍊錶的倒數第n個節點

題目:

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。

給定乙個鍊錶:1-

>2-

>3-

>4-

>

5, 和 n =

2.當刪除了倒數第二個節點後,鍊錶變為 1

->2-

>3-

>

5.

此題的雙指標解法思路:

設定快慢指標quickslow;

根據n的大小來設定兩個指標之間的間隔;

兩個指標同時前進相同步數步

quick指標到達末尾nullptr時,此時slow指標就是要刪除的節點

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

listnode *quick,

*slow,

*tmp;

quick = slow = head;

while

(n--

>=0)

quick = quick-

>next;

}while

(quick !=

nullptr

) slow-

>next = slow-

>next-

>next;

return head;}}

;

19.刪除鍊錶的倒數第n個節點

題目:給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。

示例 1

:輸入:[1

,3,4

,2,2

]輸出:

2示例 2

:輸入:[3

,1,3

,4,2

]輸出:

3

一般而言在陣列中尋找重複項可以使用,排序之後二分查詢法,雜湊法等方法解決。但題目給出的時間複雜度和空間複雜度異常苛刻,o(1)的空間複雜度和不得對原陣列修改導致雜湊法和排序法無法使用,因此另闢蹊徑。

class

solution

}int finder =0;

// the entry of loop

while

(true)}

return finder;}}

;

75.顏色分類

題目:給定乙個鏈給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。

注意:不能使用**庫中的排序函式來解決這道題。

示例:

輸入:[2,

0,2,

1,1,

0]輸出:[0,

0,1,

1,2,

2]

任何乙個習慣於呼叫庫函式的人見到這道題的做法都是sort(), 但題目明確不能使用庫函式,演算法使用空間o(1), 事件o(n)。

同樣我們嘗試使用雙指標法來解決這一問題。

因為有三種顏色,因此將陣列分為三個子陣列分別包含0,1,2;

其邊界分別為 [0, left), [left, right), [right, arrlen-1);

我們遍歷陣列,並將三種不同顏色歸類。

class

solution

int left, right, cur, tmp;

left = cur =0;

right = len -1;

while

(cur <= right)

else

if(nums[cur]==2

)else}}

};

leetcode刷題 演算法(1) 雙指標

167.two sum ii input array is sorted easy 633.sum of square numbers easy 注意 大數,以及臨界情況 345.reverse vowels of a string easy 注意 大寫情況 680.valid palindrome...

C LeetCode刷題 雙指標

雙指標篇 題名刷題通過率難度 3無重複字元的最長子串 24.5 中等11 盛最多水的容器 43.5 中等15 三數之和 16.1 中等16 最接近的三數之和 34.6 中等18 四數之和 29.8 中等19 刪除鍊錶的倒數第n個節點 29.6 中等26 刪除排序陣列中的重複項 c leetcode刷...

leetcode刷題 雙指標

使用雙指標,乙個指向最左邊,乙個指向最右邊,判斷與目標target的大小關係 public int twosum int numbers,int target else if numbers l numbers r else return newint 0 題目 給定乙個非負整數 c 你要判斷是否存...