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++;
                }
            }
        }
    };
  • 相关阅读:
    js编码中常用的知识点
    oracle函数的使用
    oracle 临时表的使用
    oracle11G归档日志管理
    oracle中 高水位线详解
    oracle并行模式(Parallel)
    oracle常用函数详解(详细)
    oracle系统表的查询
    15000 字的 SQL 语句大全
    oracle_单引号问题和execute immediate 赋值问题
  • 原文地址:https://www.cnblogs.com/Bella2017/p/10125087.html
Copyright © 2011-2022 走看看