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 中的值賦值給鍊錶的節點
2.(節點交換法),遍歷一遍鍊錶,將小於x的節點構成鍊錶before,大於和等於x的節點構成鍊錶after,將鍊錶after 與 before相連,返回after的頭結點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;}}
;
19.刪除鍊錶的倒數第n個節點/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
else
head = head-
>next;
}
tmp1-
>next = after-
>next;
tmp2-
>next =
null
;return before-
>next;}}
;
題目:
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。
此題的雙指標解法思路:給定乙個鍊錶:1-
>2-
>3-
>4-
>
5, 和 n =
2.當刪除了倒數第二個節點後,鍊錶變為 1
->2-
>3-
>
5.
設定快慢指標quick和slow;
根據n的大小來設定兩個指標之間的間隔;
兩個指標同時前進相同步數步
當quick指標到達末尾nullptr時,此時slow指標就是要刪除的節點
19.刪除鍊錶的倒數第n個節點/**
* 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;}}
;
題目:給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。
一般而言在陣列中尋找重複項可以使用,排序之後二分查詢法,雜湊法等方法解決。但題目給出的時間複雜度和空間複雜度異常苛刻,o(1)的空間複雜度和不得對原陣列修改導致雜湊法和排序法無法使用,因此另闢蹊徑。示例 1
:輸入:[1
,3,4
,2,2
]輸出:
2示例 2
:輸入:[3
,1,3
,4,2
]輸出:
3
75.顏色分類class
solution
}int finder =0;
// the entry of loop
while
(true)}
return finder;}}
;
題目:給定乙個鏈給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:不能使用**庫中的排序函式來解決這道題。
任何乙個習慣於呼叫庫函式的人見到這道題的做法都是sort(), 但題目明確不能使用庫函式,演算法使用空間o(1), 事件o(n)。示例:
輸入:[2,
0,2,
1,1,
0]輸出:[0,
0,1,
1,2,
2]
同樣我們嘗試使用雙指標法來解決這一問題。因為有三種顏色,因此將陣列分為三個子陣列分別包含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 你要判斷是否存...