【スナップノート75】色分類
5986 ワード
タイトル
赤、白、青の合計
n
要素を含む配列が与えられ、同じ色の要素が隣接し、赤、白、青の順に並べ替えられる.この問題では、整数
0
、1
、2
を使用して、赤、白、青をそれぞれ表します.例1:
:nums = [2,0,2,1,1,0]
:[0,0,1,1,2,2]
例2:
:nums = [2,0,1]
:[0,1,2]
例3:
:nums = [0]
:[0]
例4:
:nums = [1]
:[1]
ヒント:
n == nums.length
1 <= n <= 300
nums[i]
は0
、1
または2
ステップ:
解法1(正しい)
アイデア:
golang独自のメソッドを直接利用してソートします.最終的な配列は
0,1,2
の順序で配列されるので、実際にはどのソートアルゴリズムでも問題を解決することができます.コード:
func sortColors(nums []int) {
sort.Ints(nums)
}
結果:
実行結果:実行時間:0 msにより、すべてのGoコミットで100.00%のユーザメモリ消費量:2 MBを破り、すべてのGoコミットで14.30%のユーザを破った
解法2
アイデア:
配列を巡回し、
0
を左側に、2
を右側に配置します.一度巡回すれば完了するので、時間の複雑さはO(n)
です.コード:
func sortColors(nums []int) {
left, right := 0, len(nums)-1
for left < len(nums) && nums[left] == 0 {
left++
}
for right >= 0 && nums[right] == 2 {
right--
}
for i := left; i <= right && left <= right; {
if left > i {
i = left
}
switch nums[i] {
case 0:
nums[left], nums[i] = nums[i], nums[left]
left++
case 2:
nums[right], nums[i] = nums[i], nums[right]
right--
default:
i++
}
}
}
結果:
実行結果:
実行時間:0 ms、すべてのGoコミットで100.00%のユーザーを破った
メモリ消費量:2 MB、すべてのGoコミットで62.50%のユーザーを破った
公式の答え:
答えの3番目の解法と同じです.
https://leetcode-cn.com/problems/sort-colors/solution/yan-se-fen-lei-by-leetcode-solution/