【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++ 确实是最好写算法的语言

相关推荐
努力学算法的蒟蒻2 分钟前
day40(12.21)——leetcode面试经典150
算法·leetcode·面试
ToddyBear4 分钟前
从字符游戏到 CPU 指令集:一道算法题背后的深度思维跃迁
数据结构·算法
光影少年6 分钟前
前端算法新手如何刷算法?
前端·算法
yuniko-n16 分钟前
【力扣 SQL 50】子查询篇
数据库·sql·leetcode
Andyshengwx17 分钟前
图论 最小生成树 MST问题
c++·算法·图论
賬號封禁中miu18 分钟前
图论之最小生成树
java·数据结构·算法·图论
闻缺陷则喜何志丹18 分钟前
【图论 拓扑排序 贪心 临项交换】P5603 小 C 与桌游 题解|普及+
c++·算法·图论·贪心·拓扑排序·洛谷·临项交换
闻缺陷则喜何志丹19 分钟前
【图论 BFS染色 并集查找 】P3663 [USACO17FEB] Why Did the Cow Cross the Road III S|普及+
c++·算法·图论·染色法·宽度优先·并集查找
月明长歌20 分钟前
Java数据结构:PriorityQueue堆与优先级队列:从概念到手写大根堆
java·数据结构·python·leetcode·
青山如墨雨如画20 分钟前
【北邮-研-图论】网络最大流的标号算法V1.0
网络·算法·图论·北邮