法一:哈希表
C++中的unordered_map
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map<int,int> umap;
for(int i:nums){
if(umap[i]==0)umap[i]++;
else return i;
}
return -1;
}
};
时间复杂度 O(N)
空间复杂度 O(N)
方法二:原地交换
贴一个佬哥绝妙的解释
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int i = 0;
while(i < nums.size()) {
if(nums[i] == i) { //如果岗位i上的人nums[i]匹配 如nums[2]=2
i++; //则为下一个岗位寻找合适人才
continue;
}
if(nums[i] == nums[nums[i]]) //如果岗位i上的人nums[i]要调到地方已有人,则人才溢出
return nums[i]; //直接放回溢出的人才
swap(nums[i],nums[nums[i]]); //如果人才既不匹配,也不溢出,则交换
}
return -1;
}
};