Lintcode: Sort Colors II
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的更多相关文章
- Lintcode: Sort Colors II 解题报告
Sort Colors II 原题链接: http://lintcode.com/zh-cn/problem/sort-colors-ii/# Given an array of n objects ...
- LintCode Sort Colors
For this problem we need to sort the array into three parts namely with three numbers standing for t ...
- [LintCode] Sort Integers II 整数排序之二
Given an integer array, sort it in ascending order. Use quick sort, merge sort, heap sort or any O(n ...
- 143. Sort Colors II
最后更新 一刷 class Solution { public void sortColors2(int[] colors, int k) { // write your code here if ( ...
- LeetCode: Sort Colors 解题报告
Sort ColorsGiven an array with n objects colored red, white or blue, sort them so that objects of th ...
- Sort Colors I & II
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- lintcode:排颜色 II
排颜色 II 给定一个有n个对象(包括k种不同的颜色,并按照1到k进行编号)的数组,将对象进行分类使相同颜色的对象相邻,并按照1,2,...k的顺序进行排序. 样例 给出colors=[3, 2, 2 ...
- LeetCode 75. 颜色分类(Sort Colors) 30
75. 颜色分类 75. Sort Colors 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...
- 【LeetCode】Sort Colors
Sort Colors Given an array with n objects colored red, white or blue, sort them so that objects of t ...
随机推荐
- 6严格的HTML:遵循标准,合乎规范
标准的网页加载速度更快,并且在其他一些冲浪设备(如电话和电视)上运行地更好.如果没有告诉浏览器使用的HTML版本,许多浏览器将使用"转换显示"模式,而这可能会导致在不同浏览器有不一 ...
- 纯css下拉菜单的制作
通过观察下拉菜单的过程,发现有两种状态,一种是鼠标没有hover时,一种是鼠标hover时. 主菜单hover时,显示子菜单:主菜单没有hover时,不显示子菜单 <!DOCTYPE html& ...
- 【转】 Update和FixedUpdate的区别
MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...
- SQL2005的cte递归查询子树
;with cteas(select id,caption,parentid,1 Gen from skywfflow where parentid =0UNION ALL select a.id,a ...
- 蓝牙HID协议笔记
1.概述 The Human Interface Device (HID)定义了蓝牙在人机接口设备中的协议.特征和使用规程.典型的应用包括蓝牙鼠标.蓝牙键盘.蓝牙游戏手柄等.该协议改编自USB ...
- FW docker使用问题总结,解决国内不能访问gcr.io的问题
docker使用问题总结 解决国内不能访问gcr.io的问题 国内可以通过https://dashboard.daocloud.io来下载. 比如?gcr.io/google_containers/p ...
- Region的预分区
1.预分区的方式 共有四种方式 2.帮助信息 help 'create' 3.第一种方式 4.在页面上查看效果(端口号:60010) 5.第二种方式 )创建文件,并在文件中书写分区的值 )创建表 6. ...
- Solaris 10下Qt编译Oracle 10g驱动
上回书讲到<Oracle 10g在Solaris 10中安装详解>,现在开始用Qt来编译下Oracle 10g驱动吧!这样就可以通过Qt程序联入Oracle数据库了! Oracle的环境变 ...
- Windows Runtime - 面向对象化的C++(并非意味着托管)
Windows 8的开发平台总体上分为两部分:一是全新的WinRT,界面搭配Metro style,二是传统的Win32..NET(SL).IE三大平台,界面为传统窗体风格.其中全新的WinRT被微软 ...
- Xcode 自定义代码段
看见老师敲程序时,快捷键一打,所需要的一整行代码都出来了,着实感觉到效率太高了. 看了几天,才反应过来为什么自己没有get这个方法呢,现在就整理一番,记录一下. 此处以@property(nonato ...