題目:
給定一個包含紅色、白色和藍色,一共 n 個元素的數組,原地對它們進行排序,使得相同顔色的元素相鄰,并按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分别表示紅色、白色和藍色。
注意:
不能使用代碼庫中的排序函數來解決這道題。
示例:
輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
方法一:暴力法
直接通過兩個 for 循環周遊數組,從 nums[0] 開始,選出一個最小的并且 <nums[i] 的數與其交換。
時間複雜度O(N^2)。
var sortColors = function(nums) {
for(var i=0;i<nums.length;i++){
var min = nums[i];
var n = i;
for(var j=i+1;j<nums.length;j++){
if(min>nums[j]){
min = nums[j];
n = j;
}
}
nums[n] = nums[i];
nums[i] = min;
}
};
方法二:直接修改法(感覺是最簡單的)
分别記錄有多少個紅色、白色、藍色,直接for循環修改。
時間複雜度O(N)。
var sortColors = function(nums) {
let red = 0 , white = 0 , blue = 0;
for(let i=0;i<nums.length;i++){
if(nums[i] == 0)
red++;
else if(nums[i] == 1)
white++;
else
blue++;
}
for(let i=0;i<red;i++){
nums[i] = 0;
}
for(let i=red;i<red+white;i++){
nums[i] = 1;
}
for(let i=red+white;i<red+white+blue;i++){
nums[i] = 2;
}
};
方法三:三指針法
因為隻有三個數字,1放在中間,0在左邊,2在右邊。是以比較如果 nums[cur]==0 ,就和 nums[p] 交換,并且兩個指針加一,如果 nums[cur]=2 ,就和 nums[p2] 交換,并且 p2–,否則移動 cur。這裡與左邊交換的時候cur++的原因是,nums[p] 的位置之前比較過,和左邊交換的時候,交換過來的數不可能是2(是2的話早就交換到右邊去了)。
時間複雜度O(N)。
var sortColors = function(nums) {
let p=0,cur=0;
let p2=nums.length-1;
for(let i=0;i<nums.length;i++){
if(nums[cur]==0){
let temp = nums[cur];
nums[cur++] = nums[p];
nums[p++] = temp;
}else if(nums[cur]==2){
let temp = nums[cur];
nums[cur] = nums[p2];
nums[p2--] = temp;
}else{
cur++;
}
}
};
本文為作者關于LeetCode的解法
大神解法請自行搜尋