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

2021-01-26 04:16

阅读:669

标签:image   ima   str   数组下标   nbsp   return   while   复数   bsp   

题目:

技术图片

 

 

解答:

方法一:哈希

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

 1 class Solution {
 2 public:
 3     int findRepeatNumber(vectorint>& nums) 
 4     {
 5         std::setint> res;
 6         
 7         for (int i = 0; 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(vectorint>& nums) 
 4     {
 5        //算法思路见剑指offer,P39-40
 6         if(nums.empty())
 7         {
 8             return -1;
 9         }
10         
11         for(int i = 0; i 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. 数组中重复的数字

标签:image   ima   str   数组下标   nbsp   return   while   复数   bsp   

原文地址:https://www.cnblogs.com/ocpc/p/12856309.html


评论


亲,登录后才可以留言!