题虽然简单,但是要多问问
是否允许修改原数组,如果可以,则排序+遍历,空间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
}