开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情
Day36 2023/02/11
难度:简单
题目
一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
数据范围:数组长度 2≤n≤1000,数组中每个数的大小0<val≤1000000
要求:空间复杂度 O(1),时间复杂度 O(n)
提示:输出时按非降序排列。
示例1
输入: [1,4,1,6]
返回值:[4,6]
说明:返回的结果中较小的数排在前面
示例2
输入:[1,2,3,3,2,9]
返回值:[1, 9]
思路一
本题属于典型的从一个集合中寻找某个元素是否存在,所以使用哈希法,将数组中每个元素出现的次数都记录再哈希表中,最后将次数为1的元素返回即可。 具体步骤:
- 创建辅助哈希表。
- 遍历数组,记录每个元素出现的次数到哈希表中。
- 返回次数为1的元素。
关键点
- 其中元素作为哈希表的k值,出现次数为哈希表的value值
算法实现
c++代码实现-哈希法
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
int n = array.size(); //数组长度
map<int, int> mp; //辅助哈希
vector<int> res;
for (int i=0; i<n; i++) //记录次数
mp[array[i]]++;
for (int i=0; i<n; i++) //出现次数为1的,存入返回数组中
{
if (mp[array[i]] == 1)
res.push_back(array[i]);
}
sort(res.begin(),res.end()); //返回元素
return res;
}
};
- 时间复杂度 --- 遍历数组,其中n为数组长度
- 空间复杂度 --- 哈希表记录数组中每个元素出现的次数,其中n为数组长度
总结
- 对于快速判断某个元素是否存在某个集合中的题目,第一时间可以想到哈希法。