LeetCode Daily 1

2021-12-30 

LeetCode T846

 

 希望自己可以坚持写博客的习惯😀

 

题目描述:

  Alice 手中有一把牌,她想要重新排列这些牌,分成若干组,使每一组的牌数都是 groupSize ,并且由 groupSize连续的牌组成。

  给你一个整数数组 hand 其中 hand[i] 是写在第 i 张牌,和一个整数 groupSize。如果她可能重新排列这些牌,返回 true否则,返回 false

 

Input:

hand = [1,2,3,6,2,3,4,7,8], groupSize = 3

 

Output:

true

 

解法:

初读此题,想都没想直接暴力求解 暴力固然简单,但只适用于不重复数字且不相隔的情况,若遇到 [1,1,2,2,3,3] 则出错。

复制代码
class Solution {
public:
    bool isNStraightHand(vector<int>& hand, int groupSize) {
        if(hand.size() % groupSize != 0) return false;
        sort(hand.begin(), hand.end());
        bool ans = true;
        for(int j = 0; j < hand.size(); j += groupSize) {
            ans = pd(j, groupSize, hand);
        }//划分多组进入判断
        return ans;
    }

    bool pd(int start, int groupSize, vector<int>& hand) {
        for(int i = start + 1; i < start + groupSize; i++) {
            if(hand[i - 1] + 1 != hand[i]) {
                return false;
            }//逐个判断是否符合情况
        }
        return true;
    }
};
复制代码

为了解决这种问题,便去想第二种:用取余判断,貌似精简,但遇到 [8,10,12] 这种隔数的情况会误判。

复制代码
class Solution {
public:
    bool isNStraightHand(vector<int>& hand, int groupSize) {
        if(hand.size() % groupSize != 0) return false;
        sort(hand.begin(), hand.end());
        vector<int> res(groupSize);
        for(int i: hand) {
            res[i % groupSize]++;
        }//将重复部分存入新数组
        for(int i = 1; i < groupSize; i++) {
            if(res[i - 1] != res[i])
                return false;
        }//若连续则各位置牌数应该相等
        return true;
    }
};
复制代码

最后相当于两种结合求解,采用unordered_map这一高科技😂

复制代码
class Solution {
public:
    bool isNStraightHand(vector<int>& hand, int groupSize) {
        if(hand.size() % groupSize != 0) return false;
        if(groupSize == 1) return true;
        unordered_map<int, int> res;
        sort(hand.begin(), hand.end());
        for(int i: hand) {
            res[i]++;
        }//在每个Key值内存入该Key出现的次数
        for(int t: hand) {
            if(res[t] == 0) continue;
            for(int i = 0; i < groupSize; i++) {
                if(res[t + i]-- <= 0)
                    return false;
            }//进行判断统计出次数
        }
        return true;
    }
};
复制代码
posted @   HM-7  阅读(102)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示