【LeetCode】每日一题 2023_11_29 无限集中的最小数字(哈希/堆)

文章目录

刷题前唠嗑


LeetCode?启动!!!

今天的题目也比较的简单,因为数据量不大,所以什么做法都能过的去

题目:无限集中的最小数字

题目链接:2336. 无限集中的最小数字

题目描述

代码与解题思路

go 复制代码
type SmallestInfiniteSet struct {
    mp map[int]bool
    less int
}

func Constructor() SmallestInfiniteSet {
    tmp := map[int]bool{}
    for i := 1; i < 1001; i++ {
        tmp[i] = true
    }
    return SmallestInfiniteSet{
        mp: tmp,
        less: 1,
    }
}

func (this *SmallestInfiniteSet) PopSmallest() int {
    this.mp[this.less] = false
    tmp := this.less
    for i := 1; i < 1001; i++ {
        if this.mp[i] == true {
            this.less = i
            break
        }
    }
    return tmp
}

func (this *SmallestInfiniteSet) AddBack(num int)  {
    this.mp[num] = true
    if num < this.less {
        this.less = num
    }
}

好吧,我承认我的代码确实是有点屎山,具体来说就是开一个 1000 的 map,然后暴力模拟出来,这种做法和 C++ 直接用 set 自动排序,然后往 set 里面插入 1000 条数据然后 pop 和 push 没啥区别。。非常的暴力

很难过,刷了大半年算法了,磕磕碰碰还是只会暴力解题,哭了,但是看到题目说数据量只有 1000,这谁能忍得住呀呜呜

偷看大佬题解

cpp 复制代码
class SmallestInfiniteSet {
public:
    vector<bool> vis;
    priority_queue<int, vector<int>, greater<int>> q;
    int idx;
    
    SmallestInfiniteSet() : idx(1) {
        vis.resize(1010, false);
    }
    
    int popSmallest() {
        int ans = -1;
        if (!q.empty()) {
            ans = q.top();
            q.pop();
            vis[ans] = false;
        } else {
            ans = idx++;
        }
        return ans;
    }
    
    void addBack(int x) {
        if (x >= idx || vis[x]) return;
        if (x == idx - 1) {
            idx--;
        } else {
            q.push(x);
            vis[x] = true;
        }
    }
};

比较操蛋的事情,大佬的题解如果用 go 来实现,那代码量估计是不小,go 可没有给堆,要我手撕一个那我可又要写屎山了,所以就用 C++ 代码冒充一下,孩子的 C++ 功底还是在的(大概,也可能已经忘光了)

主要的思路是这样的,通过一个 bool 数组来记录这个数是否存在,通过一小根堆的优先级对列维护一个小堆,让我们能 log(N) 的获取存在的最小数。

结语

想念 STL 了,C++ 确实是最好写算法的语言

相关推荐
Yingye Zhu(HPXXZYY)3 小时前
ICPC 2023 Nanjing R L 题 Elevator
算法
阿维的博客日记5 小时前
LeetCode 139. 单词拆分 - 动态规划解法详解
leetcode·动态规划·代理模式
程序员Xu6 小时前
【LeetCode热题100道笔记】二叉树的右视图
笔记·算法·leetcode
笑脸惹桃花7 小时前
50系显卡训练深度学习YOLO等算法报错的解决方法
深度学习·算法·yolo·torch·cuda
阿维的博客日记7 小时前
LeetCode 48 - 旋转图像算法详解(全网最优雅的Java算法
算法·leetcode
GEO_YScsn7 小时前
Rust 的生命周期与借用检查:安全性深度保障的基石
网络·算法
程序员Xu7 小时前
【LeetCode热题100道笔记】二叉搜索树中第 K 小的元素
笔记·算法·leetcode
THMAIL8 小时前
机器学习从入门到精通 - 数据预处理实战秘籍:清洗、转换与特征工程入门
人工智能·python·算法·机器学习·数据挖掘·逻辑回归
Kevinhbr9 小时前
CSP-J/S IS COMING
数据结构·c++·算法
蕓晨9 小时前
set的插入和pair的用法
c++·算法