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 ...
随机推荐
- Android 加入一个动作按钮
在XML中声明一个动作按钮 所有的动作按钮和其他的可以利用的items都定义在menu资源文件夹中的XML文件中.为了增加一个动作按钮到工具栏,需要在工程 /res/menu/ 目录下面创建一个新的X ...
- 【转】Unity LayerMask 的位运算
Unity的Layer Unity是用 int32来表示32个Layer层,int32用二进制来表示一共有32位. 0000 0000 0000 0000 0000 0000 0000 0000 31 ...
- [dpdk] 读开发指南(2)(内容长期整理中)
接续前节. 7 PMD (Poll Mode Driver) A Poll Mode Driver (PMD) consists of APIs, provided through the BSD d ...
- C++ 虚函数畅谈
0x01:前言 虚函数是C++里最重要的概念之一,并且是判定C++是否入门的一个热门问题.今天这篇文章简单谈谈虚函数. 0x02:虚函数简介 虚函数可以被子类实现函数所覆盖. virtual是关键字, ...
- 正则表达式lastIndex属性浅析
有这样一段代码: var newDateStr = " 11 13:48:18"; var reg = new RegExp("[0-9]+","g& ...
- Android 代码中文字在手机上显示乱码问题解决方法
在学习Android过程中,用于测试时发现,代码中的中文在真机上会显示乱码, 网上查阅了些资料,参考如下: http://www.androidchina.net/3024.html http://b ...
- ASP.NET MVC4中用 BundleCollection使用问题手记
ASP.NET MVC4中对JS和CSS的引用又做了一次变化,在MVC3中我们这样引用资源文件: <link href="@Url.Content("~/Content/Si ...
- SQL Server中的Image数据类型的操作
原文:SQL Server中的Image数据类型的操作 准备工作,在库Im_Test中建立一张表Im_Info,此表中有两个字段,分别为Pr_Id (INT),Pr_Info (IMAGE),用来存储 ...
- [LeetCode]题解(python):040-Combination Sum II
题目来源 https://leetcode.com/problems/combination-sum-ii/ Given a collection of candidate numbers (C) a ...
- ASP.NET 开发笔记1
1.GirdView 动态添加列 PostBack 后 模板列中的控件丢失的问题 http://blackboy51.blog.163.com/blog/static/511359122011910 ...