剑指offer(第二版)(golang)- 剑指 Offer 03. 数组中重复的数字

题虽然简单,但是要多问问

是否允许修改原数组,如果可以,则排序+遍历,空间O(1),时间O(n)。或者通过下标交换的方式,将对应的下标置为对应的数字,如果置数过程中发现对应下边已经有对应的数字,则证明改数字重复

如果不可以,但是有额外额空间,则申请map, 空间O(n,时间O(n)

如果都不行,则使用二分,空间O(1), 时间O(nlogn)

// 这里修改了原有的数据空间
func findRepeatNumber(nums []int) int {
	i := 0
	for i < len(nums) {
		if nums[i] == i { // 如果当前数组下标等于对应下标数字,如下标1的位置上对应数字1,则本次交换结束,进行下一次交换
			i += 1
			continue
		}
        // 如果要交换的下标对应的数字 等于当前数字,说明数字重复,直接返回即可
		if nums[nums[i]] == nums[i] {
			return nums[i]
		}
        // 否则进行交换
		nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
	}
	return -1
}


// 这里使用了额外的map空
func findRepeatNumber(nums []int) int {
	m := make(map[int]int, 0)

	for _, num := range nums {
		if _, ok := m[num]; ok {
			return num
		}else {
			m[num] = 1
		}
	}
	return -1
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值