先对数组进行排序,然后遍历,时间复杂度比较低。
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i=0;i<nums.size()-1;++i) {
if (nums[i]==nums[i+1]) return nums[i];
}
return 0;
}
};
leedcode通过:
执行用时:36 ms, 在所有 C++ 提交中击败了62.71% 的用户
内存消耗:22.3 MB, 在所有 C++ 提交中击败了97.30% 的用户
使用哈希表:
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map<int,int> m;
for (int i=0;i<nums.size();++i) {
m[nums[i]]++;
if (m[nums[i]]==2)
return nums[i];
}
return 0;
}
};
leedcode通过:
执行用时:44 ms, 在所有 C++ 提交中击败了40.46% 的用户
内存消耗:26.8 MB, 在所有 C++ 提交中击败了39.34% 的用户
通过索引判断,由于数组内的数字是0~n-1的,那么可以遍历数组,将每个数字与索引进行匹配:
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int i=0;
while(i<nums.size()) {
if (nums[i]==nums[nums[i]]&&i!=nums[i]) return nums[i];
int temp=nums[nums[i]];
nums[nums[i]]=nums[i];
nums[i]=temp;
if (i==nums[i]) ++i;
}
return 0;
}
};
leedcode通过:
执行用时:28 ms, 在所有 C++ 提交中击败了89.25% 的用户
内存消耗:22.4 MB, 在所有 C++ 提交中击败了81.07% 的用户