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. https://github.com/akullpp/awesome-java

    java stack https://github.com/akullpp/awesome-java

  2. NSUserdefaults 简介以及存储自定义数据类型的方法

    一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一 ...

  3. membership db注册工具

    C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe

  4. VB的注释

    VB程序中的注解有两种: 第1种是以单引号 ' 开头的,但如果这个符号是在双引号之内的,则视为文本,不做为注释引导符,这个符号后面的内容均为注释内容. 第2种就REM后加注释内容(REM与注释内容要空 ...

  5. sphinx续5-主索引增量索引和实时索引

    原文件地址:http://blog.itpub.net/29806344/viewspace-1400942/ 在数据库数据非常庞大的时候,而且实时有新的数据插入,如果我们不更新索引,新的数据就sea ...

  6. 设计模式:抽象工厂模式(Abstract Factory)

    定   义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 结构图: 示例结构图: 实体类: class User { public int Id { get; set; } p ...

  7. .Net程序员安卓学习之路3:Post数据给网络API

    本例我们实现一次真正的网络交互,将数据POST到API,然后接收服务器的返回值进行处理,同时引入自定义类型和传说中阿里的FastJson. 实现思路如: 1. 在API端接收客户POST的数据还原成对 ...

  8. Xcode 自定义代码段

    看见老师敲程序时,快捷键一打,所需要的一整行代码都出来了,着实感觉到效率太高了. 看了几天,才反应过来为什么自己没有get这个方法呢,现在就整理一番,记录一下. 此处以@property(nonato ...

  9. Oracle deadlock SX/SSX caused by no index on foreign key.

    Example to show the dead lock caused by lack of index on foreign key of child table. Session 1: crea ...

  10. CentOS 6.8内核版本升级(升级至3.10)(转)

    1.查看当前版本 [root@www.linuxidc.com docker]# cat /etc/issue CentOS release 6.8 (Final) Kernel \r on an \ ...