【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
View Code

题目的解法有多种:

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])
View Code

稍微难一点的变种

原文地址:https://www.cnblogs.com/GO-NO-1/p/13881186.html