数组中重复的数字
关键词:哈希表
题目描述
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
1 2 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的元素值相等,那么输出此元素值。
代码
思路一:
1 2 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的代码:
1 2 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; }
|
思路二:
1 2 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.根据数组的特性解决问题