码迷,mamicode.com
首页 > 编程语言 > 详细

九章算法面试题70 排颜色II sort colors

时间:2015-05-18 08:59:55      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:leetcode   lintcode   九章算法   面试题   两根指针   

九章算法官网-原文网址

http://www.jiuzhang.com/problem/71/


题目

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


在线测试本题

http://www.lintcode.com/zh-cn/problem/sort-colors-ii/


解答

这道题有两种方法。

方法一: 可以借助一个O(k)的数组bucket,然后扫一遍原来的数组,统计每一种颜色有多少个存放在数组bucket里面,然后题目要求把颜色排序,其实就是再把b里面的统计重新输出到原来的数组就好了。


方法二: 题目要求不使用额外的数组,可以利用上面的思想,只不过要用原来的数组a来统计每个颜色出现的频率。由于原来的颜色肯定是正数1-k,所以我们可以用负数比如a[i]=-k,表示第i种颜色在原来的数组里面出现了k次。这道题原数组还要重复利用作为bucket数组,那么我们应该怎么办呢?首先for循环遍历一遍原来的数组,如果扫到a[i],首先检查a[a[i]]是否为正数,如果是把a[a[i]]移动a[i]存放起来,然后把a[a[i]]记为-1(表示该位置是一个计数器,计1)。 如果a[a[i]]是负数,那么说明这一个地方曾经已经计数了,那么把a[a[i]]计数减一,并把color[i] 设置为0 (表示此处已经计算过),然后重复向下遍历下一个数,这样遍历原数组所有的元素过后,数组a里面实际上存储的每种颜色的计数,然后我们倒着再输出每种颜色就可以得到我们排序后的数组。

九章算法面试题70 排颜色II sort colors

标签:leetcode   lintcode   九章算法   面试题   两根指针   

原文地址:http://blog.csdn.net/jiuzhang_ninechapter/article/details/45814073

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!