自己的思路:
思路和移動零一樣,只是進行了兩次移動,第一次為”移動2“,第二次為倒著的”移動0“(將0全部移動到最前面),中間自然會剩下1
自己的程式碼
class Solution {
public static void sortColors(int[] nums) {
// ”移動2“
int i = 0;
int j = 0;
while(j < nums.length){
if(nums[j] != 2){
nums[i] = nums[j];
i ++;
}
j ++;
}
for(;i < nums.length; i ++)
nums[i] = 2;
// 倒著移動零
i = nums.length - 1;
j = nums.length - 1;
while(j >= 0){
if(nums[j] != 0){
nums[i] = nums[j];
i --;
}
j --;
}
for(;i >= 0; i --)
nums[i] = 0;
}
}
吳師兄的:三指標
左指標,右指標,中間指標,中間指標遍歷,遇到0則和左指標交換,遇到2則和右指標交換(這裡要觀察一輪,index指標不能馬上++)
class Solution {
public void sortColors(int[] nums) {
// left 指向陣列的開始的位置,它指向的位置左側都是 0
int left = 0;
// right 指向陣列的結束的位置,它指向的位置右側都是 2
int right = nums.length - 1;
// index 指向陣列的開始位置
int index = 0;
// index 向後移動,當它越過 right 時跳出迴圈,不需要再判斷了
// 因為此時說明 index 右側的都已經是 2
while( index <= right ){
// 獲取當前的元素值
int cur = nums[index];
// 如果 index 位置上的元素值為 0
if(cur == 0){
// 說明是紅色,要放在最前面去
// 最前面的那個元素被 left 指著,所以讓 index 指向的元素和 left 指向位置上的元素進行交換
swap(nums,left,index);
// index 可以向後移動
index++;
// left 可以向後移動,它的左側區域都是 0
left++;
// 如果 index 位置上的元素值為 1
}else if(cur == 1){
// 說明是白色,就應該放在中間,不用管它,繼續移動 index
index++;
// 如果 index 位置上的元素值為 2
}else if(cur == 2){
// 說明是藍色,要放在最後面
// 所以讓 index 指向的元素和 right 指向位置上的元素進行交換
swap(nums,right,index);
// 由於原先 right 指向的元素可能為 0、1、2 這三種的任何一種
// 交換到了 index 後,還需要繼續觀察一輪,所以 index 先不移動
right--;
}
}
}
// 透過中間變數,交換兩個元素的值
// nums[i] 的值變為了 nums[j] 的值
// nums[j] 的值變為了 nums[i] 的值
private void swap(int[] nums, int i ,int j){
// 使用臨時變數 temp,儲存 nums[i] 的值
int temp = nums[i];
// nums[i] 的值修改為 nums[j] 的值
nums[i] = nums[j];
// nums[i] 的值修改為 temp 的值
nums[j] = temp;
}
}
官方題解:
單指標:其實也是雙指標
class Solution {
public static void sortColors(int[] nums) {
int i = 0;
int head = -1;
int max = nums.length;
// 移動零
while(i < max){
if(nums[i] == 0){
head ++;
swap(nums, i, head);
}
i ++;
}
// 移動1
i = head + 1;
while(i < max){
if(nums[i] == 1){
swap(nums, i , head+1);
head ++;
}
i ++;
}
}
public static void swap(int[] arrays, int a, int b){
int temp = arrays[a];
arrays[a] = arrays[b];
arrays[b] = temp;
}
}