leetcode 75 颜色分类

双指针法,分别指向下一个0的位置与下一个1的位置,值得注意的是,在遇到p0<p1,也就是p0当前位置指向一个1的时候,在i指向的数据与p0指向的数据交换后,需要将i指向的数据再次与p1指向的进行交换,因为第一步操作一定换出去了一个1。完成这一操作后,p0与p1都加1。贴代码

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

还有一种双指针的办法,其实是一样的,殊途同归。

 1 class Solution {
 2 public:
 3     void sortColors(vector<int>& nums) 
 4     {
 5         int zero = 0;
 6         int two = nums.size();
 7         int i = 0;
 8         while(i<two)
 9         {
10             if(nums[i] == 0)
11             {
12                 swap(nums[i],nums[zero]);
13                 zero++;
14                 i++;
15             }
16             else if(nums[i] == 1)
17             i++;
18             else
19             {
20                 two--;
21                 swap(nums[i],nums[two]);
22             }
23         }
24     }
25 };

 

posted @ 2021-08-24 17:27  zhaohhhh  阅读(35)  评论(0)    收藏  举报