我的输出是[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);
}
}
答案 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;
}