当前位置: 首页 > article >正文

【贪心】【哈希】个人练习-Leetcode-1296. Divide Array in Sets of K Consecutive Numbers

题目链接:https://leetcode.cn/problems/divide-array-in-sets-of-k-consecutive-numbers/description/

题目大意:给出一个数组nums[]和一个数k,求nums[]能否被分成若干个k个元素的连续的子列。

思路:比较简单,贪心就行,找到当前剩下的元素中最小的v,然后(如果合法)它必然属于某个子列,那么就找v+1, ..., v+k-1,这些元素的剩余量都减1即可。如果出现空缺,那么就返回false

很显然用哈希表比较合适。不过我开始做时,因为要从小到大遍历剩余元素,就用了map<int, int>,直接从map的头开始遍历。虽然通过了,但速度有点慢。看了题解,发现用的是unordered_map<int, int>,区别就是先把nums[]排序了一遍,然后对nums[]进行遍历。这也是OK的,因为排序后,nums[]中,每个最小的元素都需要被归入一个子列中。这样就节约了时间。

完整代码

class Solution {
public:
    bool isPossibleDivide(vector<int>& nums, int k) {
        int n = nums.size();
        if (n % k)
            return false;

        sort(nums.begin(), nums.end());
        unordered_map<int, int> cnt;
        for (auto& num : nums) {
            cnt[num]++;
        }

        for (auto& num : nums) {
            if (!cnt.count(num))
                continue;
            cnt[num]--;
            if (cnt[num] == 0)
                cnt.erase(num);
            for (int i = 1; i < k; i++) {
                if (cnt.count(num+i) != 0) {
                    cnt[num+i]--;
                    if (cnt[num+i] == 0)
                        cnt.erase(num+i);
                }
                else
                    return false;
            }
        }
        return true;
    }
};

http://www.kler.cn/a/387768.html

相关文章:

  • 高效运维:构建全面监控与自动化管理体系
  • 简单的签到程序 python笔记
  • 移门缓冲支架的作用与优势
  • 100+SCI科研绘图系列教程(R和python)
  • layui 文件上传前检查文件大小,后面再点上传出现重复提交的问题
  • Linux权限和开发工具(3)
  • 【数据库系统概论】第3章 SQL(三)数据更新
  • 将Go项目编译为可执行文件(windows/linux)
  • Web 开发新趋势下,GET 请求与 POST 请求如何抉择
  • 考研要求掌握的C语言(选择排序)
  • 给cantian建议的第二篇
  • 备忘录模式:保存对象状态的设计模式
  • Python脚本模拟远程网络探测
  • 动态规划理论基础和习题【力扣】【算法学习day.26】
  • MYSQL隔离性原理——MVCC
  • 实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
  • mac-泛洪
  • 我的 C# 白盒测试学习路线
  • [C++11] 类中新特性的添加
  • 网页版五子棋——匹配模块(服务器端开发)
  • 梧桐数据库与GBase日期函数比较
  • C++ 越来越像函数式编程了!
  • linux devfreq 模块
  • flink 内存配置(五):网络缓存调优
  • video素材格式转换--mp4转webm(vue3+Nodejs)
  • 如何运营Github Org