public class SortColors { /** * ä»å·¦å¾å³éåï¼å¦æéå°0ï¼å·¦è¾¹è¯å®å æ¯ä¸å 0ï¼ç¶åæ¯1å 1ï¼äº¤æ¢è¿åï¼å½åè¯å®æ¯1ï¼æä»¥è¦i++ã * 妿éå°2ï¼è¯å®å¾å³äº¤æ¢ï¼ç¶å交æ¢åçæ°æªç¥ï¼æä»¥iä¸è½è½»ä¸¾å¦å¨ */ // æ¶é´å¤æåº¦O(n)ï¼æ«ä¸é public void sortColors3(int[] nums) { int zero = -1, two = nums.length; for (int i = 0; i < two; ) { if (nums[i] == 0) { swap(nums, ++zero, i++); } else if (nums[i] == 2) { swap(nums, --two, i); } else { i++; } } } private void swap(int[] nums, int i, int j) { int k = nums[i]; nums[i] = nums[j]; nums[j] = k; } /** * å¦æè¦æ©å±å°k个é¢è²ï¼å¦æé¢è²ä¸º0~k * åçå¾ç®åï¼å°±æ¯ç»è®¡æ¯ä¸ªé¢è²ç个æ°ï¼è½¬æè´æ°ï¼ä¿åå¨åæ¥çæ°ç»ä¸ * ç»è®¡å®ååæ ¹æ®ä¸ªæ°è®¾ç½®æ°ç» * å ¶å®å¯ä»¥å¦å¤å¼è¾ä¸ä¸ªæ°ç»ä¿å个æ°ï¼å¦æå¯¹ç©ºé´æ²¡æè¦æ±çè¯ */ public void sortKColors(int[] colors, int k) { for (int i = 0; i < colors.length; i++) { while (colors[i] >= 0) { int color = colors[i]; if (colors[color] >= 0) { colors[i] = colors[color]; colors[color] = -2; } else { colors[color]--; colors[i] = -1; } } } for (int i = colors.length - 1; i >= 0; ) { int color = --k, count = -(colors[color] + 1); for (int j = 0; j < count; j++) { colors[i--] = color; } } } /** * http://www.lintcode.com/zh-cn/problem/sort-colors-ii/ */ // 妿é¢è²ä»1~kï¼lint public void sortColors2(int[] colors, int k) { // write your code here for (int i = 0; i < colors.length; i++) { while (colors[i] > 0) { int color = colors[i]; if (colors[color - 1] > 0) { colors[i] = colors[color - 1]; colors[color - 1] = -1; } else { colors[color - 1]--; colors[i] = 0; } } } int color = k - 1; for (int i = colors.length - 1; i >= 0; ) { for (int j = 0; j < -colors[color]; j++) { colors[i--] = color + 1; } color--; } } }