题目描述
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目第一句话很关键
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。
解题思路
原地交换法:
因为题目第一句话的限定,数组索引与值是一个一对多的关系。
因此可以遍历数组并通过交换操作使得元素索引与值变为一一对应的关系,一旦有出现重复的则说明该索引对应的数字重复了。
算法流程说明:
-
遍历数组,从i=0开始遍历
- 如果nums[i]=i,则跳过
- 如果nums[nums[i]]=nums[i],那么说明找到重复数字了,返回nums[i],
- 否则交换nums[i]和nums[nums[i]]的数值,
-
如果遍历一直没有找到的话,就返回-1.
复杂度分析
时间复杂度
时间复杂度为O(N);因为遍历数组为O(N),遍历中的判断和交换操作为O(1).
空间复杂度
空间复杂度为O(1);
哈希表法:
为此特地学了好一会的散列表(哈希表)
算法原理(JAVA):
1.建立哈希表(set) HashSet 记做dic;
2.遍历数组 nums中的每个数字num
1.当num已经在dic中,直接返回num;
2.将num加入dic中。
3.返回 -1 因为本题的描述中,题目必须出现重复的数字,所以返回什么值都没问题。
算法原理(C++)
1.s
2.
重点掌握vector类的编程以及unordered_map类的编程使用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2V02dHBU-1642556498302)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20220117024007324.png)]
题目归类
排序算法类
重复性类
相关标签
数组、哈希表、排序
- 明天(17号)题目预告: 同一题的哈希表法!
- 明天(18号)题目预告:存在重复元素、最大子数组和(标签都是数组)