go语言刷题:75. 颜色分类

75. 颜色分类
给定一个包含红色、白色和蓝色,一共 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]

算法的目标是将这三种球按颜色顺序正确地排列。它其实是三向切分快速排序的一种变种,在三向切分快速排序中,每次切分都将数组分成三个区间:小于切分元素、等于切分元素、大于切分元素,而该算法是将数组分成三个区间:等于红色、等于白色、等于蓝色。

func sortColors(nums []int) {
	//建立三个数所分别代表的指针
	zero, one, two := -1, 0, len(nums)
	//当one指针和two指针不相遇时,说明没有遍历完
	for one < two {
		//当前数字为0,将zero和one指针所代表的数字互换
		//同时更新zero和one指针
		//zero右移一步,one也右移一步
		if nums[one] == 0 {
			zero++
			swap(nums, zero, one)
			one++
		//如果当前数字为2,将one和zero指针所代表的数字互换
		//同时更新two指针,two左移一步
		//由于互换过的one指针所代表的数值还不确定,故需one指针不变,要再判断一遍
		} else if nums[one] == 2 {
			two--
			swap(nums, one, two)
		//如果当前数值=1,则one指针代表的值不需要改变,one指针右移一位
		}else {
			one++
		}
	}
}

//将两个位置的值互换
func swap(nums []int, i int, j int) {
	nums[i], nums[j] = nums[j], nums[i]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值