1. 程式人生 > 實用技巧 >leetcode 75(原地單雙指標)

leetcode 75(原地單雙指標)

本來這個題,看一眼上去就應該是sort排序(所以我寫了一行sort直接A了,,,)

實際這個題可以用移動指標的方法,,

首先看單指標:

單指標遍歷兩邊,遇見了就換

 1 class Solution {
 2 public:
 3     void sortColors(vector<int>& nums) {
 4         int n = nums.size();
 5         int ptr = 0;
 6         for (int i = 0; i < n; ++i) {
 7             if (nums[i] == 0) {
8 swap(nums[i], nums[ptr]); 9 ++ptr; 10 } 11 } 12 for (int i = ptr; i < n; ++i) { 13 if (nums[i] == 1) { 14 swap(nums[i], nums[ptr]); 15 ++ptr; 16 } 17 } 18 } 19 };

時間複雜度O(nums.size())

空間複雜度O(1)

雙指標(我覺得我不太適合寫雙指標orz,裡面有很多需要注意的東西)

要注意p0,p1的含義

p0說明這個玩意之前是0

p1說明這個之前是1

你要明白如果你把0放好了,就不能再動了(因為0已經是搞在了最前面)

所以如果p0向後移動,p1也必須要一起移動

還有一個問題就是,p1在p0前面了,結果忽然遇見一個0

這個時候往往是這樣:

前面一堆0然後第一個1標記為p1,後面是一堆1

這個時候i忽然遇見一個0,跟0交換的就是1了 

但實際上1 也已經是排好了的

所以這個時候沒有辦法,只能把原來的第一個1放到i的位置,然後把0放過來

class Solution {
public:
    
void sortColors(vector<int>& nums) { int n = nums.size(); int p0 = 0, p1 = 0; for (int i = 0; i < n; ++i) { if (nums[i] == 1) { swap(nums[i], nums[p1]); ++p1; } else if (nums[i] == 0) { swap(nums[i], nums[p0]); if (p0 < p1) { swap(nums[i], nums[p1]); } ++p0; ++p1; } } } };

總之,雙指標的坑太多了啊啊啊啊!!!!!!