zoukankan      html  css  js  c++  java
  • lintcode:颜色分类

    颜色分类

    给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。

    我们可以使用整数 0,1 和 2 分别代表红,白,蓝。

    样例

    给你数组 [1, 0, 1, 2], 需要将该数组原地排序为 [0, 1, 1, 2]

    解题

    暴力:两次快排 、扫描数组,记录0 1 2 的个数,更新数组 

    下面是一次快排 + 线性查找

    对于数组 A,两个指针 low high

    low指向 0的都跳过,结束的时候指向: 1或 2 

    high指向2的都跳过,结束的时候指向 :0 或 1

    当是(1 ,0)时候,交换 low++ 使得0归位

    当是(2,0)时候,交换high-- 使得 2归位

    当是(2,1)时候,交换high-- 是的2归位

    当时(1,1)时候,就比较复杂了

    先左找,找到第一个0 和左1互换 low++ 

    找不到0的时候从右1开始右找,找到第一个2的时候,和右1互换 high--

    当左找不到2的时候,说明low  high之间全是 1 结束

    时间复杂度O(N)

    class Solution {
        /**
         * @param nums: A list of integer which is 0, 1 or 2 
         * @return: nothing
         */
        public void sortColors(int[] A) {
            // write your code here
            if(A == null)
                return;
            int len = A.length;
            int low = 0;
            int high = len - 1;
            while(low < high){
                while(low <= high && A[low] == 0) low++;
                while(low <= high && A[high] ==2) high--;
                if(low < high ){
                    if(A[low] == 1 && A[high] ==0){
                        A[low] = 0;
                        A[high] = 1;
                        low++;
                    }else if(A[low]==2 && A[high] ==0){
                        A[low] =0;
                        A[high] =2;
                        low++;
                        high--;
                    }else if(A[low]==2 && A[high] ==1){
                        A[low] =1;
                        A[high] =2;
                        high--;
                    }else if(A[low] == A[high] && A[low] == 1){
                        // 左开始找0
                        int tmp0 = low + 1;
                        while(tmp0 <= high && A[tmp0] != 0) tmp0++;
                        // 找到了 0 和左1交换
                        if(tmp0 <= high && A[tmp0]==0){
                            A[low] = 0;
                            A[tmp0] = 1;
                            low++;
                        }else { //没找到 0 
                            // 右开始找2
                            int tmp2 = high - 1;
                            while(tmp2 >= low && A[tmp2] != 2) tmp2--;
                            // 找到 2 和右 1 交换
                            if(tmp2 >=low && A[tmp2] == 2){
                                A[high] = 2;
                                A[tmp2] = 1;
                                high--;
                            }else{//没找到 0 也没找到 2 说明全是 1 结束
                                return;
                            }
                        }
                    }
                }
            }
        }
    }
  • 相关阅读:
    C/C++分别读取文件的一行
    (转载)C库函数strtok()
    (转载)C++常量折叠和C语言中const常量对比
    ssh
    ubuntu ufw
    uplevel
    ubuntu lucid source.list
    tail
    socket client with proc
    pack forget
  • 原文地址:https://www.cnblogs.com/theskulls/p/5293062.html
Copyright © 2011-2022 走看看