zoukankan      html  css  js  c++  java
  • leetcode 75 Sort Colors 计数排序,三路快排

    解法一:计数排序:统计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++;
                }
            }
        }
    };
  • 相关阅读:
    【转】IOC和工厂模式联合使用简化工厂模式
    2014年12月24日
    【转】使用java程序模拟页面发送http的post请求
    2014年12月5日
    JAVA的double值去掉"E"
    多表联接查询解析
    Struts从后台向前台传递数据
    prepareCall()执行存储过程
    PreparedStatement
    C++ 中的new和delete理解与实操应用
  • 原文地址:https://www.cnblogs.com/Bella2017/p/10125087.html
Copyright © 2011-2022 走看看