荷兰国旗问题

问题:现有若干由红、白、蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起,这里希望将所有红色的条块放在最左边,所有白色条块放在中间,所有蓝色条块放在最右边。
思路:红白蓝分别用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)
}
全部评论

相关推荐

10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务