题目
力扣-剑指 Offer 03. 数组中重复的数字
我的复述:
假设一个名为nums
的数组里[2,3,1,0,2,5,3]
,只需要写代码,找出重复的数字2或者3即可。
题解
Map
最常用,也是最容易想到的解法。
一次遍历,将扫描到数字做判断,如果可以在map
中查到,就添加进去,否则返回这个数字,因为这个数字已经在map
里存在了,属于重复数字。
1 2 3 4 5 6 7 8 9 10 11 12 13
| func findRepeatNumber(nums []int) int { var nummap = make(map[int]bool) for _,num := range nums { if !nummap[num] { nummap[num] = true } else { return num } }
return -1 }
|
leetcode-cn
执行:
1 2 3
| 执行用时: 56 ms, 在所有 Go 提交中击败了8.84%的用户 内存消耗:8.9 MB, 在所有 Go 提交中击败了39.48%的用户
|
牛客网执行:
1 2 3 4
| 运行时间:3ms 超过100.00%用Go提交的代码 占用内存:832KB 超过100.00%用Go提交的代码
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public int findRepeatNumber(int[] nums) { Set<Integer> dic = new HashSet<>(); for (int num : nums) { if (dic.contains(num)) { return num; } else { dic.add(num); } } return -1; } }
|
原地交换
遍历数组并通过交换操作,使元素的 索引与值一一对应(即nums[i] = inums[i]=i
)。因而,就能通过索引映射对应的值,起到与字典等价的作用。可以看这个题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| func findRepeatNumber(nums []int) int { i := 0 for i < len(nums) { if nums[i] == i { i++ continue } if nums[nums[i]] == nums[i] { return nums[i] } tmp := nums[i] nums[i] = nums[tmp] nums[tmp] = tmp }
return -1 }
|
leetcode-cn执行:
1 2 3
| 执行用时: 40 ms, 在所有 Go 提交中击败了86.59%的用户 内存消耗:8.7 MB, 在所有 Go 提交中击败了89.50%的用户
|