トピック:
https://leetcode-cn.com/problems/sort-colors/
、赤、白、青、合計n個の配列の要素、in situでそれらをソートし、同じ色を持つように隣接する素子と、赤、白、青の順に配置所与。
この問題は、我々は、赤、白、青を表す0、1、2の整数を使用します。
注:
あなたがこの質問を解決するためのソート機能のコードベースを使用することはできません。
例:
入力:[2,0,2,1,1,0]
出力:[0,0,1,1,2,2]
高度:
直感的なソリューションは、注文を用いたアルゴリズム二回のスキャンを数えることです。
まず、要素0、1、2、及びその後の数の反復計算は、現在のアレイを上書き、0,1,2ソート。
あなただけの一定のスペースアルゴリズムを使用しない単一のパスを考えることができますか?
問題解決のためのアイデア
- 、再びそれをスキャン異なる要素の数を記録した後、配列を移入、それは確かに可能であるが、それは調査の目的ではありません
- bは0,0に初期化、N-1であり、wは、それぞれ、赤の右側、右側白、青の左側を指すポインタ3、R、
- 1両+現在のポイント赤、スイッチ素子R、W及びW、IF =
- W及び左側にR、交換ので、限りRとして<Wは、Rは、そうR + = 1の交換後、ホワイト向けることができます
- wは現在、次に+ = 1 wは、白色を指している場合
- 現在、青色を指し、次にスイッチ素子bとwがwの場合、B-1 =
- B W右側ので、第1の移動しないwを交換した後、点は依然として、= 1全てB-後、可能W 3であり得ること
- ループBの右にWまで(一方W <= B)
コード
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# - sanity check
if not nums:
return nums
# - 3 pointers
# - r: right side of red
# - w: right white of white
# - b: left side of blue
r,w,b = 0,0,len(nums)-1
while w <= b:
if nums[w] == 0:
if w > r:
nums[r], nums[w] = nums[w], nums[r]
w += 1
r += 1
elif nums[w] == 1:
w += 1
elif nums[w] == 2:
if w < b:
nums[b], nums[w] = nums[w], nums[b]
b -= 1