• lintcode:排颜色 II


    排颜色 II

    给定一个有n个对象(包括k种不同的颜色,并按照1到k进行编号)的数组,将对象进行分类使相同颜色的对象相邻,并按照1,2,...k的顺序进行排序。

    样例

    给出colors=[3, 2, 2, 1, 4]k=4, 你的代码应该在原地操作使得数组变成[1, 2, 2, 3, 4]

    解题

    直接快排

    class Solution {
        /**
         * @param colors: A list of integer
         * @param k: An integer
         * @return: nothing
         */
        public void sortColors2(int[] colors, int k) {
            // write your code here
            sort(colors,0,colors.length - 1);
        }
        public void sort(int[] A,int low,int high){
            if(low >= high)
                return ;
            int i = low;
            int j = high;
            int tmp = A[low];
            while(i<j){
                while(i<j && A[j]>tmp) j--;
                if(i<j){
                    A[i] = A[j];
                    i++;
                }
                while(i<j && A[i]<= tmp) i++;
                if(i<j){
                    A[j] = A[i];
                    j--;
                }
            }
            A[i] = tmp;
            sort(A,low,i-1);
            sort(A,i+1,high);
        }
    }
    Java Code

    标记法,先统计各个颜色的次数,然后根据数组更改次数

    class Solution {
        /**
         * @param colors: A list of integer
         * @param k: An integer
         * @return: nothing
         */
        public void sortColors2(int[] colors, int k) {
            // write your code here
            int[] flag = new int[k+1];
            for(int i = 0;i<colors.length;i++){
                flag[colors[i]]++;
            }
            int c = 1;
            for(int i = 0;i<colors.length;i++){
                while(flag[c]==0){// 颜色可能为0 的比较多
                    c++;
                }
                colors[i] = c;
                flag[c]--;
            }
        }
        
    }
    View Code

    只有三种颜色的排序 的时候,但是当有多个的时候判断情况太多。

    九章看到两个指针的方法

    class Solution {
        /**
         * @param colors: A list of integer
         * @param k: An integer
         * @return: nothing
         */
            public void sortColors2(int[] colors, int k) {
            int count = 0;
            int start = 0;
            int end = colors.length-1;
            while (count < k) {
                int min = Integer.MAX_VALUE;
                int max = Integer.MIN_VALUE;
                
                for (int i = start; i <= end; i++) {
                    min = Math.min(min, colors[i]);
                    max = Math.max(max, colors[i]);
                }
                int left = start;
                int right = end;
                int cur = left;
                while(cur <= right) {
                    if (colors[cur] == min) {
                        swap(left, cur, colors);
                        cur++;
                        left++;
                    } else if (colors[cur] > min && colors[cur] < max) {
                        cur++;
                    } else {
                        int tmp = colors[cur];
                        swap(cur, right, colors);
                        right--;
                    }
                }
                count += 2;
                start = left;
                end = right;
            }
        }
        
        void swap(int left, int right, int[] colors) {
            int tmp = colors[left];
            colors[left] = colors[right];
            colors[right] = tmp;
        }
        
    }

      

    理解不透,脑子太笨。

  • 相关阅读:
    啊,好久没更新了,今天分享一个小工具,两个方法,转换字节数组成十六进制字符串
    Oracle的关于建表,约束,查询等的练习
    Oracle的完整练习,纯手工打字,可能有一两点错误。。。
    Oracle的用户管理,授权及备份
    Oracle视图,序列及同义词、集合操作
    Oracle的总体回顾
    Oracle表管理
    Oracle基本代码学习
    网上B2C书城,1.0javaWEB版!!好几天没更新了,都忙着做那个网站了~
    Daily Scrum 12.23
  • 原文地址:https://www.cnblogs.com/theskulls/p/5293491.html
Copyright © 2020-2023  润新知