Sort Colors II

Description:

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.

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?

Solution:

class Solution{
public:
	/**
	 * @param colors: A list of integer
	 * @param k: An integer
	 * @return: nothing
	 */    
	void sortColors2(vector<int> &colors, int k) {
		auto sz = (int)colors.size();
		if (sz == 0) return;
		int t = 0;
		for (int i = 0; i < sz; ++i) {
			if (colors[i] < 0) continue;
			if (colors[colors[i]-1] > 0) {
				t = colors[i];
				if (t > i) {
					colors[i] = colors[colors[i]-1];
					colors[t-1] = -1;
					--i;
				} else colors[t-1] = -1;
			} else --colors[colors[i]-1];
		}
		t = sz-1;
		for (int i = k-1; i >= 0; --i)
			for (int j = 0; j < -colors[i]; ++j)
				colors[t--] = i+1;
	}
};
posted @ 2015-09-18 20:13  影湛  阅读(143)  评论(0)    收藏  举报