leetcode:对具有k种不同颜色的n个对象进行排序

时间:2015-07-31 17:31:06

标签: arrays algorithm sorting

我的输出是[1,2,2,4,3],不对。它应该是[1,2,2,3,4]。但我在代码中找不到错误。任何人都可以帮我找出算法的错误吗?谢谢。 我的整个代码都复制在下面。它可以实现。

问题:

给定一组n个具有k种不同颜色的对象(从1到k编号),对它们进行排序,使相同颜色的对象相邻,颜色顺序为1,2,... k。

实施例: 给定颜色= [3,2,2,1,4],k = 4,您的代码应该将颜色排列为[1,2,2,3,4]。

要求: 一个相当直接的解决方案是使用计数排序的两遍算法。这将花费O(k)额外的内存。你可以不用额外的记忆吗?

import java.util.Arrays;

public class SortColorsII {
   public static 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] == max) {  
                swap(cur, right, colors);  
                right--;  
            } else {  
                cur++; 
            }  
        }  
        count += 2;  
        start = left;  
        end = right;  
    }  
}  

private static void swap(int left, int right, int[] colors) {  
    int tmp = colors[left];  
    colors[left] = colors[right];  
    colors[right] = tmp;  
} 
   public static void main(String[] args){
    int[] colors = new int[]{3, 2, 2, 1, 4};
    int k = 4;
    sortColors2(colors,  k);
    String res = Arrays.toString(colors);
    System.out.println(res);
   }
}

2 个答案:

答案 0 :(得分:1)

Your minimum/maximum search excludes the last element. Use an inclusive upper bound:

for (int i = start; i <= end; i++) 

答案 1 :(得分:0)

这是我针对这个问题的o(n)时间和o(1)解决方案

int j = 0;
public void sortColors(int[] nums) {
    if(nums.length == 0)
        return;
   for(int i=0; i<=2; ++i){
       j = sort(j, i, nums);
   }
}

int sort(int start, int color, int A[]){
    int k = start;
    for(int i=start; i<A.length; ++i){
        if(A[i] == color){
            int temp = A[k];
            A[k] = A[i];
            A[i] = temp;
            ++k;
        }
    }
    // the last index of the current color
    return k;
}