剑指 Offer 03. 数组中重复的数字
题意
一个所有数都在0~n之间的存在重复的数组,任意找出一个重复的数。
题解
思路:遍历数组,利用所有数都在0~n之间这一特点,将下标与值对应进行置换,下标不等于值则将值置换到对应下标,如果出现置换的时候已经存在对应值和下标的情况,则说明是重复的数,返回即可。
- 时间复杂度:最坏情况下需要尝试n次,O(n)
空间复杂度:原地置换,
不需要多余空间,只需要常数等级空间,O(1)func findRepeatNumber(nums []int) int {for i := 0; i < len(nums); i++ {for i != nums[i] {if nums[nums[i]] == nums[i] {return nums[i]}nums[nums[i]], nums[i] = nums[i], nums[nums[i]]}}return -1}
结果:
执行用时:36 ms, 在所有 Go 提交中击败了97.08%的用户
- 内存消耗:8.7 MB, 在所有 Go 提交中击败了74.13%的用户
