public int findRepeatNumber(int[] nums) {
int n = nums.length;
HashSet<Integer> set = new HashSet<>();
for(int num : nums){
if (!set.add(num)) {
return num;
}
}
return -1;
}
class Solution {
public int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
for (int i = 1; i < nums.length; i++) {
if (nums[i] == nums[i - 1]) {
return nums[i];
}
}
return -1;
}
}
哈希表
时间:O(n)
空间:O(n)
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
if (!set.add(num)) {
return num;
}
}
return -1;
}
}
给出在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内这个条件时,考虑原地交换
时间:O(n)
空间:O(1)
class Solution {
public int findRepeatNumber(int[] nums) {
int i = 0;
while (i < nums.length) {
if (i == nums[i]) {
i++;
continue;
} else if (nums[nums[i]] == nums[i]) {
return nums[i];
}
int temp = nums[i];
nums[i] = nums[nums[i]];
nums[temp] = temp;
}
return -1;
}
}
共以下 9 个回答
“`java
class Solution {
public int findRepeatDocument(int[] documents) {
if (documents == null || documents.length == 0) {
return 0;
}
//优化,不使用额外空间,因为数组中的元素小于等于数组的长度,所以可以把数组元素放到对应下标上
for (int i = 0; i < documents.length; i++) { while (i != documents[i]) { int h = documents[i]; if (documents[h] == h) { return h; } documents[i] = documents[h]; documents[h] = h; } } return 0; } }
时间复杂度:O(n)
空间复杂度:O(1)
时间O(n)
用set去重
排序
时间:O(nlogn)
空间:O(1)
哈希表
时间:O(n)
空间:O(n)
给出在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内这个条件时,考虑原地交换
时间:O(n)
空间:O(1)
时间复杂度O(1)
空间复杂度O(n2)
“`C++
int findRepeatNumber(int* nums, int numsSize){
if(nums == NULL || numsSize <= 0) return -1;
}
“`