剑指 Offer 03. 数组中重复的数字

排序

通过对数组排序,相同的数字必定相邻,扫描一下就行,但是时间复杂度为O(nlogn)

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;
  }
};

哈希表

时间复杂度为O(n),空间复杂度为O(n)

class Solution {
public:
   int findRepeatNumber(vector<int>& nums) {
       unordered_map<int, bool> tmp;
       for(int i=0; i<nums.size(); i++)
      {
           if(tmp.count(nums[i]))
          {
               return nums[i];
          }
           tmp[nums[i]]=true;
      }
       return 0;
  }
};

遍历

这个遍历的方法比较取巧,因为n个数字对应0到n-1,那么只要在遍历的时候,把相应的值放在对应的位置,那么等下次再有值要放在对应位置的时候,就找到了重复数字。

class Solution {
public:
   int findRepeatNumber(vector<int>& nums) {
       for(int i=0; i<nums.size(); i++)
      {
           while(nums[i] != i)
          {
               if(nums[i] == nums[nums[i]])
              {
                   return nums[i];
              }
               int tmp = nums[i];
               nums[i] = nums[tmp];
               nums[tmp] = tmp;
          }
      }
       return 0;
  }
};

 

posted @ 2021-10-18 21:20  渴望成为大佬的菜鸡  阅读(22)  评论(0)    收藏  举报