描述
一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
数据范围:数组长度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]
方法:哈希表(推荐使用)
知识点:哈希表
哈希表是一种根据关键码(key)直接访问值(value)的一种数据结构。而这种直接访问意味着只要知道key就能在�(1)O(1)时间内得到value,因此哈希表常用来统计频率、快速检验某个元素是否出现过等。
思路:
既然有两个数字只出现了一次,我们就统计每个数字的出现次数,利用哈希表的快速根据key值访问其频率值。
具体做法:
step 1:遍历数组,用哈希表统计每个数字出现的频率。
step 2:然后再遍历一次数组,对比哈希表,找到出现频率为1的两个数字。
step 3:最后整理次序输出。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array)
{
// write code here
unordered_map<int,int>mp;
vector<int> res;
//遍历数组
for(int i=0;i<array.size();i++)
//统计每个数出现的频率
mp[array[i]]++;
//再次遍历数组
for(int i=0;i<array.size();i++)
//找到频率为1的两个数
if(mp[array[i]]==1)
res.push_back(array[i]);
//整理次序
if(res[0]<res[1])
return res;
else
return {res[1],res[0]};
}
};
复杂度分析:
时间复杂度:O(n),其中n为数组长度,两次单独的遍历数组每个元素
空间复杂度:O(n),哈希表的长度应该为(n−2)/2