看到题目第一反应是:哈希
或者:排序,再依次遍历找到重复数字
或者:排序,如果第i个位置的数字不是i,一定存在重复
方法一:哈希
class Solution { public: int findRepeatNumber(vector<int>& nums) { unordered_map<int,int> hashmap; for(int i:nums) { hashmap[i]++; if(hashmap[i]>1) { return i; break; } } return -1; } };
方法二:排序,遍历
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]; break; } } return -1; } };
方法三
class Solution { public: int findRepeatNumber(vector<int>& nums) { for(int i=0;i<nums.size();i++) { while(i!=nums[i]) { if(nums[i]==nums[nums[i]]) { return nums[i]; break; } swap(nums[i],nums[nums[i]]); } } return -1; } };
第三个方法自己没有改出来,照着书上思路重新敲的,自己的代码没有考虑如果数组中的数字是{1,2,3,3},即没有0的情况。
书中代码完美避开这个问题。
最后时间最少的是方法三。
越努力,越幸运!