码迷,mamicode.com
首页 > 编程语言 > 详细

leetcode 75 Sort Colors 计数排序,三路快排

时间:2018-12-15 22:30:31      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:assert   范围   for   空间   移位   个数   分享   复杂   size   

技术分享图片

技术分享图片

解法一:计数排序:统计0,1,2 的个数

时间复杂度:O(n)

空间复杂度:O(k)    k为元素的取值范围, 此题为O(1)

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int count[3] = {0};  //存放0,1,2三个元素的频率
        for(int i=0;i<nums.size();i++){
            assert(nums[i] >=0 && nums[i]<=2);  //若不符合条件则报错
            count[nums[i]] ++;
        }
        int index = 0;
        for(int i=0;i<count[0];i++)
            nums[index++] = 0;
        for(int i=0;i<count[1];i++)
            nums[index++] = 1;
        for(int i=0;i<count[2];i++)
            nums[index++] = 2;
    }
};

解法二:三路快排

技术分享图片

时间复杂度:O(n)

空间复杂度:O(1)

只遍历了一遍

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int zero = -1; //nums[0...zero] == 0 , 即设置初始状态为无效的数组
        int two = nums.size();  //nums[two...n-1] ==2, 初始化two==n
        for(int i=0;i<two;){
            //有一部分i不需要++
            if(nums[i] == 1)
                i++;
            else if(nums[i] ==2){
                two -- ; //two移位到前一位,即还没有处理的元素上
                
                //将two前的还未排序的元素与2交换位置
                swap(nums[i],nums[two]); 
                
            }
            else{
                //nums[i] == 0
                assert(nums[i] ==0);
                zero ++ ;
                //zero++后指向的是1,相当于将1和0交换位置,所以i++
                swap(nums[zero],nums[i]);  
                i++;
            }
        }
    }
};

 

leetcode 75 Sort Colors 计数排序,三路快排

标签:assert   范围   for   空间   移位   个数   分享   复杂   size   

原文地址:https://www.cnblogs.com/Bella2017/p/10125087.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!