面试题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. 数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章