leetcode 75(原地單雙指標)
阿新 • • 發佈:2020-10-07
本來這個題,看一眼上去就應該是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; } } } };
總之,雙指標的坑太多了啊啊啊啊!!!!!!