概述
目的是对一个0,1和2的数组进行排序,所有的0在开始,所有的1在中间,所有的2在最后。解决方案的空间复杂度应该是O(1),这意味着你不应该在给定数组的输入大小方面分配任何额外的空间。
鸡蛋
Input: [0, 1, 2, 0, 1]
Output: [0, 0, 1, 1, 2]
Input: [1, 0]
Output: [0, 1]
有两种方法可以解决这个问题
第一种方法我们可以在数组上进行迭代,并且可以保留0、1和2的计数。一旦我们有了这个计数,再在数组上迭代,先分配0的数量,然后是1的数量,最后是2的数量。
第二种方法。 在第二种方法中,我们可以有三个索引
-
低位初始化为0
-
中初始化为0
-
高初始化为输入数组的长度减去1
现在在数组上迭代中间的位置
-
如果我们遇到一个0,我们把它移到左边的low位置。递增low和mid
-
如果我们遇到一个1,我们只需做mid++。
-
如果我们遇到一个2,我们只需将它移到右边的位置high。递减高位
以下是相同的程序
第一种方法 - 使用计数
package main
import "fmt"
func main() {
sortNums([]int{2, 0, 2, 1, 1, 0})
}
func sortNums(nums []int) {
zeroCount := 0
oneCount := 0
twoCount := 0
for i := 0; i < len(nums); i++ {
switch nums[i] {
case 0:
zeroCount++
case 1:
oneCount++
case 2:
twoCount++
}
}
counter := 0
for i := 0; i < zeroCount; i++ {
nums[counter] = 0
counter++
}
for i := 0; i < oneCount; i++ {
nums[counter] = 1
counter++
}
for i := 0; i < twoCount; i++ {
nums[counter] = 2
counter++
}
fmt.Println(nums)
}
输出
[0 0 1 1 2 2]
第二种方法--使用切换和洗牌
package main
import "fmt"
func main() {
sortNums([]int{2, 0, 2, 1, 1, 0})
}
func sortNums(nums []int) {
low := 0
mid := 0
high := len(nums) - 1
for mid <= high {
switch nums[mid] {
case 0:
nums[low], nums[mid] = nums[mid], nums[low]
low++
mid++
case 1:
mid++
case 2:
nums[mid], nums[high] = nums[high], nums[mid]
high--
}
}
fmt.Println(nums)
}
输出
[0 0 1 1 2 2]