給定一個n個對象顏色爲紅色,白色或藍色的數組,對其進行排序,使相同顏色的對象相鄰,顏色爲紅色,白色和藍色。
在這裏,我們將使用0,1和2的整數分別表示紅色,白色和藍色。
優化前的思路及代碼:
class Solution {
public void sortColors(int[] nums) {
//時間複雜度:O(n)空間複雜度:O(1)
int[] count = {0,0,0};//存放0,1,2三個元素的出現頻率
for(int num : nums){
if(num >= 0 && num <= 2)//確保數組中元素的值都爲0,1,2
count[num]++;
else
System.out.println("您輸入的數組元素有誤");
}
int index = 0;//原來數組的下標,重新排序
int j = 0;//數組中的元素
while(j < count.length){
for(int i = 0;i<count[j];i++){
nums[index++] = j;
}
j++;
}
}
}
參考三路快排後的思路及代碼:class Solution {
public void sortColors(int[] nums) {
//時間複雜度:O(n)空間複雜度:O(1)[只遍歷一遍完成題目的要求]
int zero = -1; //nums[0...zero] == 0;
int two = nums.length; //nums[two,n-1] == 2;
for(int i = 0;i < two;){
if(nums[i]==1) {
i++;
}else if(nums[i] == 2) {
//two--;
int temp = nums[i];
nums[i] = nums[--two];
nums[two] = temp;
}else {
if(nums[i] == 0){
//zero++;
int tmp = nums[++zero];
nums[zero] = nums[i];
nums[i] = tmp;
i++;
}else{
System.out.println("您輸入的數組的數據有誤!!!");
}
}
}
}
}