LeetCOde914 卡牌分组

ops/2025/1/2 16:23:49/

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

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

一、问题描述

给定一副牌,每张牌上都写着一个整数。我们需要选定一个数字 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 数组占用空间)。

五、总结

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

 


http://www.ppmy.cn/ops/146362.html

相关文章

深入探索Django:常用实用方法指南

Django是一个高级的Python Web框架,旨在快速开发和简洁、实用的设计。它内置了许多功能,使得开发者能够高效地构建Web应用。在这篇博文中,我们将深入探讨一些Django中常用的实用方法,这些方法可以帮助你更好地控制Django应用的行为,使其更加灵活和安全。 © ivwdcwso …

周末总结(2024/12/28)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利…

Mono里运行C#脚本12—load_section_tables

前面已经分析加载EXE文件头的内容,但是还有一个section tables的头,因为在前面MonoPEDatadir里定义的内容太简单了,只有8个字节一项,只能说明每一段的开始位置和大小,并没有这段的属性,那么只能在后增加一头来描述这段的属性了。 如下图所示的SECTION_HEADER: 要想解析这…

【深度学习环境】NVIDIA Driver、Cuda和Pytorch(centos9机器,要用到显示器)

文章目录 一 、Anaconda install二、 NIVIDIA driver install三、 Cuda install四、Pytorch install 一 、Anaconda install Step 1 Go to the official website: https://www.anaconda.com/download Input your email and submit. Step 2 Select your version, and click i…

集装箱的纸箱和塑料箱识别数据集,使用YOLO,COCO JSON,PASICAL VOC XML格式标注,识别准确率高达97.5%

集装箱的纸箱和塑料箱识别数据集&#xff0c;使用YOLO&#xff0c;COCO JSON&#xff0c;PASICAL VOC XML格式标注&#xff0c;识别准确率高达97.5% 数据集分割 训练组88&#xff05; 4605图片 有效集8% 438图片 测试集4% 219图片 预处理 自动定向&#x…

惠普HP proliant DL380 G6服务器使用

惠普HP proliant DL380 G6服务器使用经历 前言 HP ProLiant DL380 G6是一款机架式服务器&#xff0c;标配1个Xeon E5504处理器。 已被列入“高耗能老旧通信设备淘汰指导目录” 配置 基本类别 类别 机架式 结构 2U 内存 内存类型 DDRIII 内存大小 4GB&#xff08;单条插槽…

mysql9.0windows安装

第一步下载 官网地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 点击后&#xff0c;选择不登录下载 第二步安装 双击下载的msi文件进行安装。打开后页面如下&#xff0c;选择安装类型&#xff0c;选择自定义安装。点击Next下一步。 自行选择安装目录 选好后点击…

【HENU】河南大学计院2024 操作系统 简答题复习

和光同尘_我的个人主页 一直游到海水变蓝。 单项选择 15x2 30 判断 10x1 10 简答 3x10 30 综合 3x10 30 简答题 简述操作系统的四个基本特征。 并发性 共享性 虚拟性 异步性 并发性是最重要特性&#xff0c;其它三种特性以此为前提。 并发 并发(Concurrence)&#…