荷兰国旗问题
问题:现有若干由红、白、蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起,这里希望将所有红色的条块放在最左边,所有白色条块放在中间,所有蓝色条块放在最右边。
思路:红白蓝分别用0、1、2表示。
定义三个指针,初始化begin=0, cur=0(可能指向元素为2), end=len(goal)-1,然后cur右移:
if cur->0,则cur和begin指向元素完成交换,同时begin和cur右移
if cur->1,则cur右移
if cur->2,则cur和end指向元素完成交换,同时cur指针不动(可能交换前end所指元素为0),end左移
循环下去,直到cur > end,操作结束!
package main
import "fmt"
func threeColors(goal []int) {
if len(goal) < 2 {
return
}
begin, cur, end := 0, 0, len(goal)-1
for cur <= end {
if goal[cur] == 0 {
goal[begin], goal[cur] = goal[cur], goal[begin]
begin++
cur++
} else if goal[cur] == 1 {
cur++
} else {
goal[end], goal[cur] = goal[cur], goal[end]
end--
}
}
}
func main() {
// goal := []int{1, 2, 0, 1, 0, 2, 1, 0, 2}
goal := []int{2, 1, 0, 1, 2}
threeColors(goal)
fmt.Println(goal)
} 
