【LeetCode】剑指 Offer 03. 数组中重复的数字
题目
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
1 class Solution(object): 2 def findRepeatNumber(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 for _idx in range(0, len(nums)): 8 while nums[_idx] != _idx: 9 10 if nums[nums[_idx]] == nums[_idx]: 11 return nums[_idx] 12 13 temp = nums[_idx] 14 nums[_idx] = nums[temp] 15 nums[temp] = temp
题目的解法有多种:
1、先排序后计数;
2、用hash计数,额外空间O(N),时间O(N)
3、鸽巢原理,额外空间O(1),时间O(N)
拓展
思考如果要找到所有重复数字:
(还有个小问题,未处理同样值多输出)
1 # coding:utf-8 2 """ 3 题目: 4 现有整数数组a大小为n,每个元素 0 <= ai < n,其中每个值可能出现一次货两次,求出现值两次的元素 5 Demo: 6 输入: 7 2 3 4 1 3 8 输出: 9 3 10 """ 11 12 13 class Solution(object): 14 def findRepeatNumber(self, nums): 15 """ 16 :type nums: List[int] 17 :rtype: int 18 """ 19 for _idx in range(0, len(nums)): 20 while nums[_idx] != _idx: 21 # temp = nums[_idx] 22 # print(_idx, nums[_idx], nums[temp]) 23 if nums[nums[_idx]] == nums[_idx]: 24 print(nums[_idx]) 25 break 26 27 temp = nums[_idx] 28 nums[_idx] = nums[temp] 29 nums[temp] = temp 30 31 32 if __name__ == "__main__": 33 Solution().findRepeatNumber([1,2,3,4,1,3,2]) 34 # Solution().findRepeatNumber([1,3,2,4,1,0,3]) 35 # Solution().findRepeatNumber([2,3,4,3,2])
稍微难一点的变种