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

相关推荐
橘子遇见BUG2 小时前
算法日记 33 day 动态规划(打家劫舍,股票买卖)
算法·动态规划
格雷亚赛克斯2 小时前
黑马——c语言零基础p139-p145
c语言·数据结构·算法
南宫生2 小时前
力扣-位运算-3【算法学习day.43】
学习·算法·leetcode
Edward The Bunny2 小时前
[算法] 前缀函数与KMP算法
算法
码农多耕地呗2 小时前
区间选点:贪心——acwing
算法
醉酒柴柴2 小时前
【代码pycharm】动手学深度学习v2-08 线性回归 + 基础优化算法
深度学习·算法·pycharm
财富探秘者2 小时前
贵州茅台[600519]行情数据接口
大数据·c语言·python·算法·金融·restful
至善迎风2 小时前
施密特正交化与单位化的情形
线性代数·算法·决策树·机器学习
HABuo3 小时前
【数据结构与算法】合并链表、链表分割、链表回文结构
c语言·开发语言·数据结构·c++·学习·算法·链表
逸风尊者3 小时前
开发也能看懂的大模型:RNN
java·后端·算法