先对数组进行排序,然后遍历,时间复杂度比较低。
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% 的用户
