Given an array of n objects with k different colors (numbered from 1 to k), sort them so that objects of the same color are adjacent, with the colors in the order 1, 2, ... k.

Note
You are not suppose to use the library's sort function for this problem. Example
GIven colors=[3, 2, 2, 1, 4], k=4, your code should sort colors in-place to [1, 2, 2, 3, 4]. Challenge
A rather straight forward solution is a two-pass algorithm using counting sort. That will cost O(k) extra memory. Can you do it without using extra memory?

先写了个O(kN)时间复杂度,O(1)空间复杂度的, 这个算法适合颜色数比较少的情况(k is constant)

 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
if (colors==null || colors.length==0 || k<=1) return;
int l=0, r=colors.length-1;
int cnt = 1;
for (; cnt<k; cnt++) {
while (true) {
while (l<r && colors[l]==cnt) {
l++;
}
while (l<r && colors[r]!=cnt) {
r--;
}
if (l == r) break;
swap(colors, l, r);
}
r = colors.length-1;
if (l == r) break;
}
} public void swap(int[] colors, int l, int r) {
int temp = colors[l];
colors[l] = colors[r];
colors[r] = temp;
}
}

K->N的话,上面时间复杂度就大了,所以干脆用Quick Sort

 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
if (colors==null || colors.length==0 || k<=1) return;
quickSort(colors, 0, colors.length-1);
} public void quickSort(int[] colors, int l, int r) {
if (l >= r) return;
int pivot = r;
int pos = partition(colors, l, r, pivot);
quickSort(colors, l, pos-1);
quickSort(colors, pos+1, r);
} public int partition(int[] colors, int start, int end, int pivot) {
int l=start, r=end;
while (true) {
while (l<r && colors[l]<colors[pivot]) {
l++;
}
while (l<r && colors[r]>=colors[pivot]) {
r--;
}
if (l == r) break;
swap(colors, l, r);
}
swap(colors, l, end);
return l;
} public void swap(int[] colors, int l, int r) {
int temp = colors[l];
colors[l] = colors[r];
colors[r] = temp;
}
}

有人给出了O(N)的解法(better solution)

inplace,并且O(N)时间复杂度的算法。

O(n): use the array itself as space to store counts. We use A[k-1] to store the count of color k. We use negtive number to store count, in order to be distnct with the color value. This method ASSUMES that every color between 1 and k will appear.

At position i, if A[i] is positive, we check the value of A[A[i]-1], if it is a positive number, i.e., not counted yet, we then put A[A[i]-1] to A[i], and set A[A[i]-1] as -1 to indicate that there is one of this color.

If A[A[i]-1] is a negtive or zero value, we then simply decrease it by one and set A[i] as 0 to indicate that this position is couted already.

At position i, we repeat this procedure until A[i] becomes 0 or negtive, we then move to i+1.

At counting, we draw colors into array.

3 2 2 1 4

2 2 -1 1 4

2 -1 -1 1 4

0 -2 -1 1 4

-1 -2 -1 0 4

-1 -2 -1 -1 0

 class Solution {
/**
* @param colors: A list of integer
* @param k: An integer
* @return: nothing
*/
public void sortColors2(int[] colors, int k) {
//The method assumes that every color much appear in the array.
int len = colors.length;
if (len<k) return; //count the number of each color.
for (int i=0;i<len;i++){
while (colors[i]>0){
int key = colors[i]-1;
if (colors[key]<=0){
colors[key]--;
colors[i]=0;
}
else {
colors[i] = colors[key];
colors[key] = -1;
}
}
} //draw colors.
int index = len - 1;
for (int i = k - 1; i >= 0; i--) {
int cnt = -colors[i]; // Empty number.
if (cnt == 0) {
continue;
} while (cnt > 0) {
colors[index--] = i + 1;
cnt--;
}
}
}
}

若k事先不知道,一样的,就是开始维护一个counter, 在过程中算一下。

 class Solution {
/**
* @param colors: A list of integer
* @param k: An integer
* @return: nothing
*/
public void sortColors2(int[] colors) {
// write your code here
int len = colors.length; int count = 0;
for (int i=0; i<len; i++) {
while (colors[i] > 0) {
count++;
int pos = colors[i]-1; //最好搞个变量存一下,之后方便
if (colors[pos] > 0) {
colors[i] = colors[pos];
colors[pos] = -1;
}
else {
colors[pos]--;
colors[i] = 0;
}
}
} //sort
int index = colors.length-1;
for (int j=count; j>0; j--) {
int num = -colors[j-1];
while (num > 0) {
colors[index--] = j;
num--;
}
}
}
}

Lintcode: Sort Colors II的更多相关文章

  1. Lintcode: Sort Colors II 解题报告

    Sort Colors II 原题链接: http://lintcode.com/zh-cn/problem/sort-colors-ii/# Given an array of n objects ...

  2. LintCode Sort Colors

    For this problem we need to sort the array into three parts namely with three numbers standing for t ...

  3. [LintCode] Sort Integers II 整数排序之二

    Given an integer array, sort it in ascending order. Use quick sort, merge sort, heap sort or any O(n ...

  4. 143. Sort Colors II

    最后更新 一刷 class Solution { public void sortColors2(int[] colors, int k) { // write your code here if ( ...

  5. LeetCode: Sort Colors 解题报告

    Sort ColorsGiven an array with n objects colored red, white or blue, sort them so that objects of th ...

  6. Sort Colors I & II

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  7. lintcode:排颜色 II

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

  8. LeetCode 75. 颜色分类(Sort Colors) 30

    75. 颜色分类 75. Sort Colors 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...

  9. 【LeetCode】Sort Colors

    Sort Colors Given an array with n objects colored red, white or blue, sort them so that objects of t ...

随机推荐

  1. ArrayList调用remove方法需要注意的地方

    ArrayList中有remove 方法和 removeAll方法, ArrayList中不仅继承了接口Collection中的remove方法,而且还扩展了remove方法. Collection中 ...

  2. 高级 Synth

    http://www.ibm.com/developerworks/cn/java/j-synth/

  3. 蓝牙的SDP协议总结

    1.概念     SDP协议让客户机的应用程序发现存在的服务器应用程序提供的服务以及这些服务的属性.SDP只提供发现服务的机制,不提供使用这些服务的方法.每个蓝牙设备都需要一个SDP Service, ...

  4. mysql参数,蛮全的

    网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...

  5. PHP 日期比较

    $temptime = mktime(8,2,12,4,4,2014);$dt1 = date("Y-m-d",time());$dt2 = date("Y-m-d&qu ...

  6. PM2的使用

    PM2 是一个带有负载均衡功能的 Node 应用的进程管理器. 安装 npm install -g pm2 启动程序:pm2 start <app_name|id|all> 列举进程:pm ...

  7. c#中如何将一个string数组转换为int数组

    举个例子. string[] strArray = "a,b,c,d,e,f,g".Split(new char[]{ ',' }); int[] intArray; //C# 3 ...

  8. iOS 给UILabel文字加下划线

    摘自:http://blog.sina.com.cn/s/blog_6cd380c10101b6hn.html //带下划线的“注” NSMutableAttributedString可变的属性字符串 ...

  9. Hibernate 代码生成器

    Hibernate 代码生成器 点击Hibernate Code Generation 点击以下 创建管理代码生成配置 点击RUN.自动生成

  10. Java学习-022-Properties 文件数据写入

    Properties 配置文件写入主要通过 Properties.setProperty 和 Properties.store 两个方法,此文以一个简单的 properties 文件写入源码做示例. ...