此题的难点在于复杂度,On的时间复杂度就注定基于排序的方法无法使用,那就只能使用在查找任务中效率很高的哈希表。但如果全存进去,空间复杂度又会超出,所以要考虑如何在遍历的过程中对哈希表做适当的删减。

思路:哈希表中每加入一个值,就检查是否有等于当前记录的最小值的键,如果有则删去该键并哈希表中的每个值都自加一。

关键点:用int*作为值可以简化哈希表的值自加一的循环操作。

但其实最坏情况下,这个方法的空间复杂度还是On。

#include <unordered_map>
class Solution {
  public:
    void disapear(unordered_map<int, int*>& hash, int* target) {
        while (hash.find(*target) != hash.end()) { // 检查是否有与当前最小值相等的键
            hash.erase(*target); //删除该键
            (*target)++; //哈希表中所有值自加一
        }
    }

    int minNumberDisappeared(vector<int>& nums) {
        unordered_map<int, int*> hash; //创建一个int为键,int*为值的哈希表
        int* res = new int(1); //记录未出现的最小值
        for (int i = 0; i < nums.size(); i++) {//遍历数组
            hash[nums[i]] = res; //每个都加入哈希表中
            disapear(hash, res); 
        }
        return *res;
    }
};