本博客为记录个人学习笔记,方便日后复习。
刷题平台:LeedCode
题目描述
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
题目分析
我们可以注意到数组中的数字都是在0——n-1的范围,如果这个数组中没有重复的数字,那么当数组排序之后数字
i
i
i 将出现在下标为
i
i
i 的位置,由于数组中有重复的数字,有些位置可能存在多个数字,同时有些位置没有数字。
现在让我们重新排这个数组。从头到尾依次扫描这个数组中的每个数字。当扫描到下标为
i
i
i 的数字时,首先比较这个数字
m
m
m 是不是等于
i
i
i。如果是,则扫描下一个数字;如果不是,则再拿他和第
m
m
m(数组下标)个数字进行比较。如果他和第
m
m
m(数组下标)个数字相等,就找到了一个重复的数字;如果他和第
m
m
m(数组下标)个数字不相等,就吧第
i
i
i(数组下标)个数字和第
m
m
m(数组下标)个数字交换,吧
m
m
m放到属于他的位置。接下来重复这个比较和交换的过程,知道我们发现一个重复的数字。
代码实现
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
if(nums.empty()){
return -1;
}
for(int i=0;i<nums.size();i++){
while(nums[i]!=i){
if(nums[i]==nums[nums[i]]){
return nums[i];
}
else{
swap(nums[i],nums[nums[i]]);
}
}
}
return -1;
}
};
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
if(nums.empty()){
return -1;
}
unordered_map<int,int> mp;
for(int i=0;i<nums.size();i++){
if(mp.find(nums[i])!=mp.end()){
return nums[i];
}
else{
mp[nums[i]]++;
}
}
return -1;
}
};
本文介绍了一种在LeetCode上解决重复数字问题的有效算法。该算法利用数组元素的特性,通过一次遍历和交换操作,高效地找到数组中的重复数字,避免了额外的空间消耗。

1156

被折叠的 条评论
为什么被折叠?



