【贪心】【哈希表】个人练习-Leetcode-846. Hand of Straights

题目链接:https://leetcode.cn/problems/hand-of-straights/

题目大意:给出一数列,求是否能刚好将它们分成若干组,每组的元素数量为groupSize,并且元素连续。

思路:因为题目的限制很死,如果能够分那么分的结果一定是确定的。那么就可以贪心做。

先排序,并记录每种元素出现的次数,用哈希表cnt来记。然后从小到大遍历,每轮从【残存次数大于0的最小的数】开始(可以用一个vector来存这些数字,每个只存一次,起到一个set一样的效果),然后往后groupSize的数的残存次数都-1。如果中间任何一个地方出问题都会不合法,直接返回false

做完一下就通过了,但时间不是很理想。于是改了一下,每轮找【残存次数大于0的最小的数】的下标可以复用,直接从上一轮的继承就行了。结果果然快了不少。

完整代码

cpp 复制代码
class Solution {
public:
    bool isNStraightHand(vector<int>& hand, int groupSize) {
        int n = hand.size();
        if (n % groupSize)
            return false;
        sort(hand.begin(), hand.end());
        vector<int> nums;
        
        unordered_map<int, int> cnt;
        for (auto x : hand) {
            cnt[x]++;
            if (nums.size() == 0 || nums.back() != x)
                nums.emplace_back(x);
        }

        int lpn = n / groupSize;
        int idx = 0;
        for (int k = 0; k < lpn; k++) {
            while (cnt[nums[idx]] == 0)
                idx++;
            int num = nums[idx];
            if (cnt[num]) {
                cnt[num]--;
                for (int j = num+1; j < num + groupSize; j++) {
                    if (cnt[j] == 0)
                        return false;
                    else 
                        cnt[j]--;     
                }
            }
        }
        return true;
    }
};
相关推荐
qyzm14 小时前
牛客周赛 Round 140
数据结构·python·算法
Severus_black14 小时前
顺序表、单链表经典算法题分享(未完待续...)
c语言·数据结构·算法·链表
我不是懒洋洋14 小时前
【经典题目】栈和队列面试题(括号匹配问题、用队列实现栈、设计循环队列、用栈实现队列)
c语言·开发语言·数据结构·算法·leetcode·链表·ecmascript
锅挤14 小时前
数据结构复习(第七章):查找
数据结构
Xiaoᴗo.15 小时前
C语言2.0---------
c语言·开发语言·数据结构
Java_小白呀15 小时前
考研408数据结构(栈与队列)
数据结构·考研·栈和队列·考研408
Brilliantwxx15 小时前
【数据结构】排序算法的神奇世界(下)
c语言·数据结构·笔记·算法·排序算法
进击的荆棘15 小时前
递归、搜索与回溯——二叉树中的深搜
数据结构·c++·算法·leetcode·深度优先·dfs
人道领域15 小时前
【LeetCode刷题日记】:151翻转字符串的单词(两种解法)
java·开发语言·算法·leetcode·面试
会编程的土豆15 小时前
【日常做题】栈 中缀前缀后缀
开发语言·数据结构·算法