数组中重复的数字
关键词:哈希表
题目描述
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
| 12
 3
 
 | 输入:[2, 3, 1, 0, 2, 5, 3]
 输出:2 或 3
 
 | 
思路
思路一:哈希表
1.鲁棒性:如果数组的长度小于等于1,返回false
2.利用哈希表的思想将数组的数先存入;
3.再遍历哈希表,返回第一个重复数字。
思路二:
已知数组中的每一个数字值小于数组长度,如果数组中无任何重复的数字,则数组从小到大排序后理应满足第i个位置对应的元素值是i。利用此特性(数组{2, 3, 1, 0, 2, 5, 3},指针’|’):
指针’|’此时的位置是0,而数组中位置0的元素值是2,2 != 0,将数组中位置0与位置2的元素相互交换。
指针’|’的位置依然是0,而数组中位置0的元素值是1,1 != 0,将数组中位置0与位置1的元素相互交换。
指针’|’的位置依然是0,而数组中位置0的元素值是3,3 != 0,将数组中位置0与位置3的元素相互交换。
指针’|’的位置依然是0,但数组中位置0的元素值是0,0 == 0,将指针’|’右移一位。
指针’|’此时的位置是1,但数组中位置1的元素值是1,1 == 1,将指针’|’右移一位。
指针’|’此时的位置是2,但数组中位置2的元素值是2,2 == 2,将指针’|’右移一位。
指针’|’此时的位置是3,但数组中位置3的元素值是3,3 == 3,将指针’|’右移一位。
指针’|’此时的位置是4,而数组中位置4的元素值是2,2 != 4,且数组中位置4与位置2的元素值相等,那么输出此元素值。
代码
思路一:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | class Solution {
 public:
 bool duplicate(int numbers[], int length, int* duplication) {
 if(length <= 1) return false;
 vector<int> vec(length);
 for(int i = 0; i < length; i++){
 vec[numbers[i]]++;
 }
 for(int i = 0; i < length; i++){
 if(vec[numbers[i]] > 1){
 *duplication = numbers[i];
 return true;
 }
 }
 return false;
 }
 };
 
 | 
包含IO的代码:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | #include <iostream>#include <vector>
 
 using namespace std;
 int findRepeatNumber(vector<int>& nums)
 {
 int len = nums.size();
 if(len <= 1)
 return -1;
 vector<int> hush(len);
 for(int i = 0; i < len; i++)
 {
 hush[nums[i]]++;
 if(hush[nums[i]] > 1)
 return nums[i];
 }
 return -1;
 }
 
 int main()
 {
 int a;
 vector<int> nums;
 while(cin >> a)
 {
 nums.push_back(a);
 if(cin.get() == '\n'){
 break;
 }
 }
 int res = findRepeatNumber(nums);
 cout << res << endl;
 return 0;
 }
 
 | 
思路二:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | bool duplicate(int numbers[], int length, int* duplication) {
 if (numbers == 0 || length == 0) {
 return false;
 }
 for (int i = 0; i < length; i++) {
 while (numbers[i] != i) {
 if (numbers[i] == numbers[numbers[i]]) {
 *duplication = numbers[i];
 return true;
 }
 else {
 int temp = numbers[i];
 numbers[i] = numbers[temp];
 numbers[temp] = temp;
 }
 }
 }
 return false;
 }
 
 | 
知识点
1.哈希表思想的应用
2.根据数组的特性解决问题