先对数组进行排序,然后遍历,时间复杂度比较低。

    1. class Solution {
    2. public:
    3. int findRepeatNumber(vector<int>& nums) {
    4. sort(nums.begin(), nums.end());
    5. for (int i=0;i<nums.size()-1;++i) {
    6. if (nums[i]==nums[i+1]) return nums[i];
    7. }
    8. return 0;
    9. }
    10. };

    leedcode通过:

    1. 执行用时:36 ms, 在所有 C++ 提交中击败了62.71% 的用户
    2. 内存消耗:22.3 MB, 在所有 C++ 提交中击败了97.30% 的用户

    使用哈希表:

    1. class Solution {
    2. public:
    3. int findRepeatNumber(vector<int>& nums) {
    4. unordered_map<int,int> m;
    5. for (int i=0;i<nums.size();++i) {
    6. m[nums[i]]++;
    7. if (m[nums[i]]==2)
    8. return nums[i];
    9. }
    10. return 0;
    11. }
    12. };

    leedcode通过:

    1. 执行用时:44 ms, 在所有 C++ 提交中击败了40.46% 的用户
    2. 内存消耗:26.8 MB, 在所有 C++ 提交中击败了39.34% 的用户

    通过索引判断,由于数组内的数字是0~n-1的,那么可以遍历数组,将每个数字与索引进行匹配:

    1. class Solution {
    2. public:
    3. int findRepeatNumber(vector<int>& nums) {
    4. int i=0;
    5. while(i<nums.size()) {
    6. if (nums[i]==nums[nums[i]]&&i!=nums[i]) return nums[i];
    7. int temp=nums[nums[i]];
    8. nums[nums[i]]=nums[i];
    9. nums[i]=temp;
    10. if (i==nums[i]) ++i;
    11. }
    12. return 0;
    13. }
    14. };

    leedcode通过:

    1. 执行用时:28 ms, 在所有 C++ 提交中击败了89.25% 的用户
    2. 内存消耗:22.4 MB, 在所有 C++ 提交中击败了81.07% 的用户