leetcode 75題【優美的寫法】

leoma2012發表於2019-01-16

給定一個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。

注意:
不能使用程式碼庫中的排序函式來解決這道題。
示例:
輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
進階:
一個直觀的解決方案是使用計數排序的兩趟掃描演算法。
首先,迭代計算出0、1 和 2 元素的個數,然後按照0、1、2的排序,重寫當前陣列。
你能想出一個僅使用常數空間的一趟掃描演算法嗎?

解題思路

定義三個指標i,j,k分別代表0,1,2的位置,然後遍歷陣列。當是0時,則i,j,k全部前進一步,並把i,j,k對應位置的數分別設定為0,1,2,因為陣列被要求按照從大到小的位置排列的。同理,當是1時,則j,k分別前進一步,設定為1,2。當是2時,則只有k前進一步,設定為2。
注意,設定對應的數時,需要按照k->j->i的順序,以達到讓已經設定好的數字向右移動的目的。具體程式碼如下。
java版本的

class Solution {
 public void sortColors(int[] nums) {
     int i = 0;
     int j = 0;
     int k = 0;
     for(int m = 0;m < nums.length;m++){
         if(nums[m]==0){
             nums[k++] = 2;
             nums[j++] = 1;
             nums[i++] = 0;
             
         }else if(nums[m]==1){
             nums[k++] = 2;
             nums[j++] = 1;
         }else{
             nums[k++] = 2;
         }
     }
 }
}

相關文章