JZ56 数组中只出现一次的两个数字

111 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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. 创建辅助哈希表。
  2. 遍历数组,记录每个元素出现的次数到哈希表中。
  3. 返回次数为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;
    }
};
  • 时间复杂度 O(n)O(n) --- 遍历数组,其中n为数组长度
  • 空间复杂度 O(n)O(n) --- 哈希表记录数组中每个元素出现的次数,其中n为数组长度

总结

  • 对于快速判断某个元素是否存在某个集合中的题目,第一时间可以想到哈希法。