面试题03. 数组中重复的数字

Posted ocpc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题03. 数组中重复的数字相关的知识,希望对你有一定的参考价值。

题目:

技术图片

 

 

解答:

方法一:哈希

使用哈希来进行处理,当发现哈希中包含相应的元素时,则表示出现了重复的元素,则返回即可。

 1 class Solution {
 2 public:
 3     int findRepeatNumber(vector<int>& nums) 
 4     {
 5         std::set<int> res;
 6         
 7         for (int i = 0; i < nums.size(); i++)
 8         {
 9             // 若包含元素, 则返回
10             if (res.count(nums[i]))
11             {
12                 return nums[i];
13             }
14             else
15             {
16                 // 若不包含元素, 则插入
17                 res.insert(nums[i]);
18             }
19         }
20 
21         return -1;
22     }
23 };

 

方法二:仍然为哈希

  • 因为所有数字都在 0 ~ n-1 的范围内,其实完全可以省掉额外的空间开辟,将每个位置的数交换映射到其对应的数组下标下面,当出现新的元素与其对应的下标中的数字相等时,即为重复数字。
  • 这本质还是哈希的思想,思路 1 是使用库函数申请额外空间,思路 2 则是数组本身做哈希表,达到了节省空间的目的;
  • 此处会用到 while 循环,原因是保证交换过来的新元素位置也要正确
 1 class Solution {
 2 public:
 3     int findRepeatNumber(vector<int>& nums) 
 4     {
 5        //算法思路见剑指offer,P39-40
 6         if(nums.empty())
 7         {
 8             return -1;
 9         }
10         
11         for(int i = 0; i < nums.size(); ++i)
12         {
13             while(nums[i] != i)
14             {
15                 if(nums[i] == nums[nums[i]])
16                 {
17                     return nums[i];
18                 }
19                 else
20                 {
21                     swap(nums[i], nums[nums[i]]);
22                 }
23             }
24         }
25         
26         return -1;
27     }
28 };

 

以上是关于面试题03. 数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 面试题03 数组中重复的数字

剑指Offer面试题03-数组中重复的数字

面试题03. 数组中重复的数字

面试题03. 数组中重复的数字

面试题3:数组中重复的数字

面试题3:数组中重复的数字