題目:給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:
不能使用**庫中的排序函式來解決這道題。
示例:
輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
高階:
乙個直觀的解決方案是使用計數排序的兩趟掃瞄演算法。
首先,迭代計算出0、1 和 2 元素的個數,然後按照0、1、2的排序,重寫當前陣列。
你能想出乙個僅使用常數空間的一趟掃瞄演算法嗎?
這道題我們結合三路快排的思想來解決。首先定義兩個指標zero和two,其中zero指向陣列頭元素的前乙個位置,two指向陣列尾元素的最後乙個位置。然後從陣列頭元素開始遍歷。
當陣列中的元素值為1時,直接跳過進行i++
當陣列中的元素值為0時,zero++,讓其指向陣列第乙個位置,然後進行交換,讓數值為0的元素從陣列最前開始往後放。最後進行i++,使其遍歷下乙個元素
當陣列中的元素值為2時,two–,讓其指向陣列最後乙個位置,然後進行交換,讓數值為2的元素從陣列最後開始往前放。(注意:這裡不要進行i++,因為我們不知道和2交換後當前值為0還是1,如果為0時我們還得以當前值進入迴圈讓其交換到陣列的前半部分)
**如下:
class
solution
else
}return;}
};
題目:
給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:必須在原陣列上操作,不能拷貝額外的陣列。
儘量減少操作次數。
首先題目說了不能借用其他陣列,只能在原陣列上面操作。所以我們可以先遍歷陣列,在遍歷的過程中,將不為0 的元素從第一位開始往後放。當遍歷完一次陣列後,我們將後面剩下的元素直接全部賦值為0,這樣就相當於把0全部滯後了。
**如下:
class
solution
}for
(int j=k;jsize()
;j++)}
};
LeetCode 75 顏色分類 283 移動零
1.雙指標 75 顏色分類 這個荷蘭國旗曾經是我怎麼都看不懂,今天好像突然明白了 首先這個p0和p1的用意在於 你最終結果肯定是0000111122222這種形式的 p0 和 p1標誌著在你遍歷路上遇見的還不是0和1 的index i則是在尋找等於0或者1的數,因為最終2的前面就是0和1 但是如果遇...
LintCode 顏色分類
題目 給定乙個包含紅,白,藍且長度為 n 的陣列,將陣列元素進行分類使相同顏色的元素相鄰,並按照紅 白 藍的順序進行排序。我們可以使用整數 0,1 和 2 分別代表紅,白,藍。挑戰 乙個相當直接的解決方案是使用計數排序掃瞄2遍的演算法。首先,迭代陣列計算 0,1,2 出現的次數,然後依次用 0,1,...
75 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...