1. 程式人生 > >leetcode_陣列排序

leetcode_陣列排序

75. 顏色分類 

給定一個包含紅色、白色和藍色,一共 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。

注意:
不能使用程式碼庫中的排序函式來解決這道題。

示例:

輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]

進階:

  • 一個直觀的解決方案是使用計數排序的兩趟掃描演算法。
    首先,迭代計算出0、1 和 2 元素的個數,然後按照0、1、2的排序,重寫當前陣列。
  • 你能想出一個僅使用常數空間的一趟掃描演算法嗎?

採用三路排序的思路,設定兩個指標 k, m ,只需遍歷一次陣列即可. 時間複雜度:O(n), 空間複雜度O(1).

class Solution {
    public void sortColors(int[] nums) {
        int k=-1;              //左閉右閉區間[0, k]存放資料0
        int m=nums.length;     //左閉右閉區間[m, nums.length-1]存放資料2
        for(int i=0; i<m; ){  //i指過得位置都是資料1,只有確定nums[i]==1時,i才能移動
            if(nums[i]==1){
                i++;
            } else if(nums[i]==0){
                k++;
                //交換位置
                if(i!=k){
                    int temp=nums[i];
                    nums[i]=nums[k];
                    nums[k]=temp;
                }
                
                i++;   //交換過來的資料是1,需要i++
                
            } else{
                m--;
                //交換位置
                if(i!=m){
                    int temp=nums[i];
                    nums[i]=nums[m];
                    nums[m]=temp;
                }
                
            }
        }
    }
}