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++;
                }
            }
        }
    };
  • 相关阅读:
    (离线算法 LCA) hdu 2874
    (树形DP) hdu 4118
    (树的重心) poj 1655
    (线性基) bzoj 2115
    (线性基) bzoj 2460
    (边双联通+树直径) hdu 4612
    (拓扑图+DP) poj 3249
    (求割点和除去割点后的联通块数目) poj 1523
    (边双联通) poj 3352
    (DP求最长路) hdu 4607
  • 原文地址:https://www.cnblogs.com/Bella2017/p/10125087.html
Copyright © 2011-2022 走看看