题解 | #数组中重复的数字#
数组中重复的数字
https://www.nowcoder.com/practice/6fe361ede7e54db1b84adc81d09d8524
#include <unordered_set> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param numbers int整型vector * @return int整型 */ int duplicate(vector<int>& numbers) { int n=numbers.size(); if(n==0 ) return -1; for(int i=0;i<n;i++) { if(numbers[i]<0||numbers[i]>=n) //判断输入是否合法 return -1; } unordered_set<int> uset; for(int i=0;i<n;i++) { if(uset.count(numbers[i])) return numbers[i]; uset.insert(numbers[i]); } return -1; } };
遍历数组中的每个元素,将其加入 unordered_set
中。如果在加入的过程中发现该元素已经存在于 unordered_set
中,说明该元素是重复的,直接返回该元素即可。
该算法的时间复杂度为O(n),空间复杂度为O(n),与使用数组或哈希表的方法相同。
可以在原数组上进行修改。遍历数组中的每个数字,将其对应的下标上的数字取相反数。如果一个数字被访问到时发现它的对应下标上的数字已经是负数了,说明该数字重复。
#include <unordered_set> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param numbers int整型vector * @return int整型 */ int duplicate(vector<int>& numbers) { int n=numbers.size(); if(n==0 ) return -1; for(int i=0;i<n;i++) { if(numbers[i]<0||numbers[i]>=n) //判断输入是否合法 return -1; } for(int i=0;i<n;i++) { int index=abs(numbers[i]); if(numbers[index]<0) return index; numbers[index]=-numbers[index]; } return -1; } };