【数组】75. 颜色分类
题目:

解答:
(1)计数排序,时间复杂度为O(n),空间复杂度为O(n)。
(2)三个指针的方式,时间复杂度为O(n),空间复杂度为O(1)。
用 i 记录0应该放的位置,j 记录2应该放的位置。
cur从0到j扫描,
遇到0,放在 i 位置,i 后移
遇到2,放在 j 位置,j 前移
遇到1,cur后移
扫描一遍得到排好序的数组。
时间O(n)且一次扫描,空间O(1),满足要求。
初始值:i = 0, cur = 0,j = array.length - 1。
1 class Solution { 2 public: 3 inline void swap(int &a, int &b) 4 { 5 int temp = a; 6 a = b; 7 b = temp; 8 } 9 void sortColors(vector<int>& nums) 10 { 11 if(nums.size() <= 1) 12 { 13 return; 14 } 15 int i = 0; 16 int j = nums.size() - 1; 17 int cur = i; 18 19 while(cur <= j) 20 { 21 if(nums[cur] == 0) 22 { 23 if(cur > i) 24 { 25 swap(nums[i++], nums[cur]); 26 } 27 else 28 { 29 //此时cur == i, A[i] == A[cur] 30 ++cur; 31 ++i; 32 } 33 } 34 else if (nums[cur] == 2) 35 { 36 if(cur < j) 37 { 38 swap(nums[j--], nums[cur]); 39 } 40 else 41 { 42 return; 43 } 44 } 45 else 46 { 47 ++cur; 48 } 49 } 50 } 51 };

浙公网安备 33010602011771号