https://www.papamelon.com/post/UIIy6W0rAvvElZuUQxcBbO6oeu93c9CJ
本题一多解,有计数法,排序法,交换法。
计数法
时间复杂度 O(N)O(N), 空间复杂度 O(N)O(N)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int n = nums.size();
vector<int> cnt(n);
for (int x : nums) cnt[x]++;
for (int i = 0; i < n; i++)
if (cnt[i] > 1) return i;
return -1;
}
};
排序法
时间复杂度 O(NlogN)O(NlogN), 空间复杂度 O(1)O(1)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 1; i < nums.size(); i++)
if (nums[i] == nums[i-1]) return nums[i];
return -1;
}
};
交换法
时间复杂度 O(N)O(N), 空间复杂度 O(1)O(1)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int n = nums.size();
for (int i = 0; i < n; i++) {
if (nums[i] == i) continue;
if (nums[nums[i]] == nums[i]) return nums[i];
swap(nums[nums[i]], nums[i]);
}
return -1;
}
};