首页 > 其他分享 >LeetCOde914 卡牌分组

LeetCOde914 卡牌分组

时间:2024-12-29 21:02:46浏览次数:3  
标签:count deck int 卡牌 次数 最大公约数 分组 LeetCOde914

扑克牌分组问题:探索最大公约数的应用

在编程的世界里,我们经常会遇到各种有趣的算法问题,今天要和大家分享的是一道关于扑克牌分组的问题,它巧妙地运用了最大公约数的概念来解决。

一、问题描述

给定一副牌,每张牌上都写着一个整数。我们需要选定一个数字 XX >= 2),使得可以将整副牌按下述规则分成 1 组或更多组:

  • 每组都有 X 张牌。
  • 组内所有的牌上都写着相同的整数。

仅当能够找到满足条件的 X 时,返回 true,否则返回 false

例如,给定牌组 [1, 2, 3, 4, 4, 3, 2, 1],我们可以将其分成两组 [1, 1][2, 2][3, 3][4, 4],此时 X = 2,满足条件,应返回 true

二、解题思路

这道题的关键在于统计牌中每个数字出现的次数,然后找出这些次数的最大公约数。如果最大公约数大于等于 2,那么就可以按照要求进行分组。

我们可以使用一个数组来统计每个数字的出现次数,然后遍历这个数组,对于出现次数大于 0 的元素,通过辗转相除法(或类似的求最大公约数的方法)来不断更新最大公约数。

三、代码实现

#include <stdio.h>
#include <stdbool.h>

// 函数用于判断给定的牌组能否按规则分组
bool hasGroupsSizeX(int* deck, int deckSize) {
    if (deckSize < 2) {
        return false;
    }
    // 用于统计每个数字出现的次数
    int count[10000] = {0};
    for (int i = 0; i < deckSize; i++) {
        count[deck[i]]++;
    }
    int x = count[deck[0]];
    for (int i = 0; i < 10000; i++) {
        if (count[i] > 0) {
            // 求最大公约数的逻辑整合在该函数内
            while (count[i] % x!= 0) {
                int temp = x;
                x = count[i] % x;
                count[i] = temp;
            }
            if (x < 2) {
                return false;
            }
        }
    }
    return x >= 2;
}

int main() {
    int deck[] = {1, 2, 3, 4, 4, 3, 2, 1};  // 示例牌组,可替换为其他测试数据
    int deckSize = sizeof(deck) / sizeof(deck[0]);
    bool result = hasGroupsSizeX(deck, deckSize);
    if (result) {
        printf("可以按照规则分组\n");
    } else {
        printf("无法按照规则分组\n");
    }
    return 0;
}

在这段代码中,首先判断牌组的大小是否小于 2,如果是则直接返回 false。然后统计每个数字的出现次数,接着选取第一个数字的出现次数作为初始的 x,通过循环遍历统计数组,对出现次数大于 0 的元素求其与 x 的最大公约数,并不断更新 x。如果在过程中 x 小于 2,则返回 false,最后根据最终的 x 是否大于等于 2 返回相应的结果。

四、时间和空间复杂度分析

  • 时间复杂度:统计牌中数字出现次数的循环需要遍历整个牌组,时间复杂度为 ,其中 n 是牌的数量(deckSize)。求最大公约数的操作最多执行 m 次,m 是牌中不同数字的个数,每次求最大公约数类似辗转相除有一定计算量,整体时间复杂度约为 。
  • 空间复杂度:使用了一个固定大小的数组来统计数字出现次数,由于数组大小固定(这里假设数字范围在一定范围内,若数字范围大需优化处理),可近似看作常数空间复杂度 (不算输入的 deck 数组占用空间)。

五、总结

这道扑克牌分组问题不仅考验了我们对数组的操作和遍历能力,更深入地涉及到了最大公约数的应用。通过巧妙地统计数字出现次数并求最大公约数,我们能够高效地解决这个看似复杂的分组问题。在解决这类问题的过程中,我们可以加深对算法和数据结构的理解,提升编程能力,为解决更复杂的问题打下坚实的基础。希望这篇博客能够帮助大家理解这道题的解法,如果有任何疑问或者更好的解法,欢迎大家一起讨论交流!

 

标签:count,deck,int,卡牌,次数,最大公约数,分组,LeetCOde914
From: https://blog.csdn.net/qq_64604732/article/details/144810255

相关文章

  • sql超时 sql中存在关键字 in 和 not in 和 <> 和 分组排序和 子查询 代码优化
    针对SQL查询中存在 IN、NOTIN、<>、分组排序和子查询的情况,优化这些查询可以显著提高性能。以下是一些具体的优化建议:1.优化 IN 和 NOTIN使用 IN 替代 NOTIN:NOTIN 在处理 NULL 值时可能会导致性能问题。可以考虑使用 NOTEXISTS 或 LEFTJOIN 替代......
  • 4.2 数据库分组查询
    1、为什么要分组上一节课我们学习了聚合函数,默认统计的是全表范围的数据。配合上where子句就能缩小统计的范围了,但是这并不能满足我们的要求。比如说我现在想查询每个部门的平均底薪是多少钱,这个就需要对员工记录,按照部门编号去分组了。比如说10部门的员工分成一组,20部门的员......
  • SQL 实战:窗口函数的妙用 – 分析排名与分组聚合
    在复杂的数据分析和查询场景中,SQL窗口函数(WindowFunctions)是提升性能和代码可读性的重要工具。窗口函数可以轻松实现排名、分组聚合、滑动平均等复杂计算,避免使用嵌套子查询或冗余的多次表扫描。本文将通过实战案例,深入剖析窗口函数的应用场景,重点讲解如何进行排名和分组......
  • 题解:P11411 兰奇的卡牌游戏
    题解:P11411兰奇的卡牌游戏今天来讲一个超级缝合题目,所以要先讲一些前置。前置知识\(1\)——单调栈[USACO06NOV]BadHairDayS题目入口题目描述农夫约翰有\(N\)头奶牛正在过乱头发节。每一头牛都站在同一排面朝右,它们被从左到右依次编号为\(1,2,\cdots,N\)。编号......
  • 洛谷 P11411 兰奇的卡牌游戏——题解
    洛谷P11411兰奇的卡牌游戏传送锚点摸鱼环节兰奇的卡牌游戏题目描述作为制卡大师的兰奇,发明了一种自助型卡牌游戏。给定\(n\)张卡牌,第\(i\)张卡牌编号为\(i\),其权值为\(a_i\),卡牌的权值互不相同。这个卡牌游戏的规则需要自己生成。一开始,所有的牌都在备选区。从备选......
  • 49. 字母异位词分组
    题目链接解题思路:方法一:每个「字母异位词」,排序后的结果,都是一致的,所以,可以用一个map,key就是排序后的字符串,value就是所有的「字母异位词」。方法二:直接使用map,不需要排序得出来,看下面的代码classSolution{public:structMyCompare{booloperator()(......
  • vue-进行分组----将轮播图数据进行分组
    效果展示第一步将数据进行分组处理例如:数据是这样的处理方法一:进行两次for循环处理方法二:进行一次for循环......
  • 烟雾检测识别智慧矿山一体机智慧矿山AI平台建设由哪几部分组成?
    随着科技的不断进步,智慧矿山建设已成为矿业领域的重要发展方向。它通过集成先进的信息技术、物联网技术、大数据分析和人工智能技术,实现对矿山生产过程的全面监控和管理,从而提高矿山的安全性、生产效率和经济效益。本文将详细介绍智慧矿山AI平台的建设构成以及视频分析技术的应用......
  • 如何在PbootCMS中动态显示多个分组的友情链接?
    在PbootCMS中,如果你希望在一个页面上动态显示多个分组的友情链接,可以通过嵌套使用 pboot:link 标签来实现。以下是如何在PbootCMS模板中动态显示多个分组的友情链接的详细步骤和示例代码:理解 pboot:link 标签: pboot:link 标签用于在模板中输出指定分组的友情链接。该标签......
  • 【量化交易】无监督学习与聚类分析:为股市“分组”
    欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:⭐️全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.⭐️AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。⭐️大数据平台建设指南:全面讲解从数据采集到......