剑指 Offer 03. 数组中重复的数字
思路1:原地置换
因为数组长度为n,所有数字都在0~n-1的范围内,所以假如数组中数字不重复,则数组元素的下标等于数组元素的值。
在此基础上,遍历数组,将元素放到值所对应的索引处。如果该索引处已存在该元素,则该元素重复,返回结果。
代码:
时间复杂度O(n),空间复杂度O(1)
class Solution { public int findRepeatNumber(int[] nums) { for (int i = 0;i<nums.length;i++) { while(nums[i]!=i) { if (nums[i] == nums[nums[i]]) return nums[i]; int tmp = nums[i]; nums[i] = nums[tmp]; nums[tmp] = tmp; } } return -1; } }
思路2:哈希表
用一个哈希表记录已遍历的元素,每次遍历时检查这个元素是否出现过。
与思路1对比,优点:不要求数字都在 0~n-1 的范围内;
缺点:空间复杂度提高到O(n)
代码:
class Solution { public int findRepeatNumber(int[] nums) { int[] cnt = new int[nums.length]; for (int num : nums) { cnt[num]++; if (cnt[num]>1) return num; } return -1; } }