荷兰国旗问题

问题一: 给定一个数组,和一个数num,把小于等于num的数放在数组的左边,大于num的数放在右边。

  1. 使用一个指针(代码中为数组下标less)存储数组中小于num的区间,从-1开始。
  2. 使用另一个指针来遍历数组(代码中为index),遍历过程中将小于等于num的数归入左边区间,数组下标下移。
func partion(arr []int, target int) {
	// 将小于等于target的数放到左边,大于target的数放到右边
	less := -1
	index := 0
	for index < len(arr) {
		if arr[index] <= target {
			less = less + 1
			swap(arr, less, index)
		}
		index = index + 1
	}
}

问题二:(荷兰国旗问题)给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在右边,大于num的数放在左边

  1. 分别使用一个指针(less和more)来区分小区间和大区间
  2. 使用index来遍历数组,对于小于num的数放到左边,index向右移,对于等于num的数index直接向右移,对于大于num的数先放到右边,index保持不动继续比较
func partionCountry(arr []int, target int) {
	// 将小于target的数放到左边,等于target的数放在中间, 大于target的数放右边
	less := -1       // 作为小区间
	more := len(arr) // 作为大区间
	index := 0
	for index < more {
		if arr[index] < target { // 如果数比目标数小
			less = less + 1
			swap(arr, less, index)
			index = index + 1
		} else if arr[index] > target { // 如果数是比目标数大
			more = more - 1
			swap(arr, more, index)
		} else { // 等于
			index = index + 1
		}
	}
}

下面是上述代码用到的用于交换数组中俩个数的方法代码:

func swap(arr []int, l, r int) {
	// 交换数组中的俩个数
	if l == r || l < 0 || r < 0 || l >= len(arr) || r >= len(arr) {
		return
	}
	arr[l], arr[r] = arr[r], arr[l]
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值