题目地址(03. 数组中重复的数字)
https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
题目描述
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000
前置知识
公司
- 暂无
思路
先排序 然后判断相邻的两个数是否相等 相等直接返回 时间复杂度为nlogN 因为排序需要这个复杂度
还可以使用hash表 理论上时间复杂度为n 但是不知道为什么比上面还慢
第三种最优解 可以根据题意 如果没有重复的数据应该是 数组的下标和数字是一一对应的 如果有数字和索引对应不上的就交换并判断是不是重复了
关键点
代码
- 语言支持:Java
Java Code:
class Solution {public int findRepeatNumber(int[] nums) {Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {if (nums[i] == nums[i + 1]) {return nums[i];}}return 0;}}
class Solution {public int findRepeatNumber(int[] nums) {HashSet<Integer> set = new HashSet<>();for (int i = 0; i < nums.length; i++) {if (set.contains(nums[i])) {return nums[i];}set.add(nums[i]);}return -1;}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=IiNbu)
- 空间复杂度:
#card=math&code=O%28n%29&id=PuajQ)
