剑指 Offer 03. 数组中重复的数字 - 力扣(LeetCode)
简单题:
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
vector<int> sign(nums.size(), 0);
for(const auto &num : nums){
if(sign[num] == 1) return num;
sign[num] = 1;
}
return 0;
}
};
如果不使用额外空间:原地置换,时间空间100% - 数组中重复的数字 - 力扣(LeetCode)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
for(int i = 0; i < nums.size(); ++i){
while(nums[i] != i){
if(nums[i] == nums[nums[i]]) return nums[i];
int tmp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i]= tmp;
}
}
return 0;
}
};
修改一下:
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
for(int i = 0; i < nums.size(); ++i){
while(nums[i] != i){//设法让索引和值相对应
if(nums[i] == nums[nums[i]]) return nums[i];//索引不同,值却相同
swap(nums[i], nums[nums[i]]);//将nums[i]放到正确的位置(索引值 == 元素值)
}
}
return 0;
}
};