leetcode_陣列排序
阿新 • • 發佈:2018-11-10
75. 顏色分類
給定一個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 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; } } } } }