這道題實際上就是讓我們不用sort()
函數來實現對原數組的排序,這里我直接使用快速排序對原數組進行排序了,也是復習一下基于快慢指針的快速排序寫法。面試手撕快排的思路參考這個視頻。
用時擊敗100%,還行。下面直接貼代碼。
class Solution {
public:void sortColors(vector<int>& nums) {quicksort(nums, 0, nums.size() - 1);}void quicksort(vector<int>& nums, int begin, int end){if(begin >= end) return ; //只有一個元素,無需排序,直接返回//排序主邏輯int pivot = nums[end];int slow = begin, fast = begin; while(fast < end){if(nums[fast] > pivot)fast++;else{swap(nums[slow], nums[fast]);slow++;fast++;}}swap(nums[slow], nums[end]); //將樞軸移動到正確位置quicksort(nums, begin, slow - 1); //對樞軸左側排序quicksort(nums, slow + 1, end); //對樞軸右側排序}
};
但是,使用快速排序無法通過一次掃描就將整個數組排序完成,還可以使用更高效的方法。我感覺靈神的題解也寫得挺通俗易懂的,感覺靈神的題解寫的特別好,還是建議去看他的題解
以下是根據靈神的題解寫出來的代碼。
class Solution {
public:void sortColors(vector<int>& nums) {int p0 = 0, p1 = 0;for(int i = 0; i < nums.size(); i++){int temp = nums[i];nums[i] = 2; if(temp <= 1){nums[p1] = 1;p1++;}if(temp == 0){nums[p0] = 0;p0++;}}}
};