【数组】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 };

 

posted @ 2020-05-05 15:56  梦醒潇湘  阅读(148)  评论(0)    收藏  举报