leetCode #75 Sort Colors

大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang

这个题目超简单是不,用计数排序就搞定了~

代码如下:

 1 class Solution {
 2 public:
 3     void sortColors(vector<int>& nums) {
 4         if (nums.size() == 0)
 5         {
 6             return;
 7         }
 8         int count1 = 0, count0 = 0;
 9         for (int num : nums)
10         {
11             if (num == 0)
12             {
13                 ++count0;
14             }
15             if (num == 1)
16             {
17                 ++count1;
18             }
19         }
20         int i = 0;
21         for (; i < count0; ++i)
22         {
23             nums[i] = 0;
24         }
25         for (; i < count0 + count1; ++i)
26         {
27             nums[i] = 1;
28         }
29         for (; i < nums.size(); ++i)
30         {
31             nums[i] = 2;
32         }
33             
34     }
35 };

 可是可是,这不是遍历了两遍吗?下面介绍遍历一遍就能完成的算法,三路快排来啦:

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

 

转载于:https://www.cnblogs.com/xiaoyajiang/p/7843506.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值