LeetCOde914 卡牌分组

devtools/2025/1/1 12:17:43/

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

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

一、问题描述

给定一副牌,每张牌上都写着一个整数。我们需要选定一个数字 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/devtools/146635.html

相关文章

8086汇编(16位汇编)学习笔记09.宏汇编

8086汇编(16位汇编)学习笔记09.宏汇编-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 宏汇编在文件中是当做关键字的,但是在bug中运行时并没有这些指令,这些关键词被称为伪指令,cpu并不认识他们,需要经过编译器转化成 cpu认识的代码,但是他多我们写代码帮助又…

RJ45网口模块设计

1、以太网概述及RJ45实物 2、常用网口信号介绍 3、RJ45网口布局布线要点分析 4、总结 1、变压器下面需要进行挖空处理&#xff0c;以免底下的铜引入干扰&#xff0c;&#xff08;将多边形挖空区域的所在层设置为Multi-Layer多层&#xff09; 2、为了更直观的看一个类中线的长…

java中泛型的作用--通俗易懂

为什么Java需要泛型 泛型&#xff08;Generics&#xff09;是Java语言中的一个强大特性&#xff0c;它允许程序员在编写代码时不指定具体的数据类型&#xff0c;而是在使用时指定。泛型的引入是为了提高代码的类型安全性、代码复用性和性能&#xff0c;同时减少类型转换的需求…

【学习笔记】ChatGPT原理与应用开发——基础科普

HuggingLLM&#xff08;ChatGPT原理与应用开发&#xff09; 原文链接&#xff1a;HuggingLLM&#xff08;ChatGPT原理与应用开发&#xff09;-课程详情 | Datawhale 此处仅为学习记录和总结 1&#xff1a;基础科普 1.1&#xff1a;自然语言背景 图灵测试 如果一个人&#x…

kafka基本概念

数据分区可以带来高并发&#xff0c;副本可以带来高可用 topic: 卡夫卡中消息存在topic中&#xff0c; 主题topic(半结构化):相当于数据库的表(结构化) 一般一个topic存储相同数据类型的数据,也可以存不同数据类型数据 partition topic又分为多个分区partition&#xff0…

同源策略详解

一、定义 同源策略&#xff08;Same-Origin Policy&#xff09;是浏览器的一种安全策略&#xff0c;它用于限制一个源&#xff08;origin&#xff09;的文档或者脚本如何与另一个源的资源进行交互。这里的“源”是由协议&#xff08;protocol&#xff09;、域名&#xff08;do…

ModelScope;Ollama搭建本地大模型

在 Windows 上实现 Qianwen 部署 以下是几种在 Windows 上实现 Qianwen 部署的方法: 使用 ModelScope 部署 环境配置 : 安装 Anaconda,安装完成后配置环境变量,可在系统高级配置中添加以下变量:%ANACONDA_HOME%、%ANACONDA_HOME%\Scripts、%ANACONDA_HOME%\Library\ming…

ReactiveStreams、Reactor、SpringWebFlux

注意&#xff1a; 本文内容于 2024-12-28 21:22:12 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;ReactiveStreams、Reactor、SpringWebFlux。感谢您的关注与支持&#xff01; ReactiveStreams是…