找到最大“葫芦”组合
文章目录
- 问题描述
- 解题思路分析
- 1. 数据预处理
- 2. 特殊情况处理
- 3. 普通情况计算
- 4. 结果输出
- Java代码实现
- 复杂度分析与优化
在经典德州扑克中,“葫芦”是一种较强的牌型。它由五张牌组成,其中三张牌面值相同,另外两张牌面值也相同。本文将探讨一个有趣的变形问题:在限定总牌面值的情况下,如何找到符合规则的最大“葫芦”组合。
问题描述
我们需要从给定的一组牌中找到一个满足以下条件的“葫芦”组合:
- 该组合由三张相同牌面值的牌 (a) 和两张相同牌面值的牌 (b) 组成;
- 牌面值的总和不能超过指定的最大值
max; - 在多个可能组合中,优先选择牌面值 (a) 较大的组合,若 (a) 相同则选择 (b) 较大的组合。
牌面值遵循德州扑克的大小规则,即 A(1)> K(13)> Q(12)> J(11)> 10 > 9 > … > 2。
解题思路分析
1. 数据预处理
首先,我们需要统计输入牌组中每张牌的数量。这样做可以快速识别哪些牌出现了三次及以上(用于构成牌 (a)),哪些牌出现了两次及以上(用于构成牌 (b))。通过一个哈希映射(HashMap)来实现统计,能够保证在 (O(n)) 时间复杂度内完成遍历和计数。
2. 特殊情况处理
根据题目中的描述,A牌(1)具有特殊的地位。为了最大化组合的大小,我们需优先考虑是否能使用A作为三张牌或两张牌的一部分,并在满足条件的情况下更新“葫芦”组合的值。
- 若 A 出现了三次或更多:则A可能作为三张牌中的 (a)。在这种情况下,我们需要在其他牌中找到数量至少为2的牌 (b),并确保该组合的牌面和在最大值
max之内。 - 若 A 出现了两次:则A可能作为两张牌中的 (b)。在这种情况下,我们需要在其他牌中找到数量至少为3的牌 (a),并判断该组合是否符合最大值要求。
3. 普通情况计算
当 A 不能参与组合或未能找到符合条件的组合时,我们可以在其他牌中寻找“葫芦”:
- 从具有三张相同牌面值的牌中选择最大的作为 (a);
- 从具有两张相同牌面值的牌中选择最大的作为 (b);
- 比较多个组合的总和,以确保不会超过最大值
max。
4. 结果输出
在所有符合条件的“葫芦”组合中,我们输出最大牌面值的 (a) 和 (b) 值,若没有符合条件的组合则输出 [0, 0]。
Java代码实现
以下是完整的 Java 实现代码:
import java.util.HashMap;
import java.util.Map;public class bigestHulu {public static int[] solution(int n, int max, int[] array) {// 由于最大A的牌面值为1,所以要特殊考虑// 1. 首先用map记录array中每个元素出现的次数Map<Integer, Integer> map = new HashMap<>();// 为了后面特殊考虑map.put(1,0);for (int card : array) {map.put(card, map.getOrDefault(card, 0) + 1);}int x = 0; // 三张相同的牌面值int y = 0; // 两张相同的牌面值// 2.1 A出现3次以上if (map.get(1) >= 3){// 遍历map,找到最大的bfor (Integer b : map.keySet()) {if (b != 1 && map.get(b) >= 2){// 没有爆牌if (1 * 3 + b * 2 <= max){if (b > y){x = 1;y = b;}}}}return new int[]{x, y};}// 2.2 A出现2次if (map.get(1) == 2){// 遍历map,找到最大的bfor (Integer b : map.keySet()) {if (b != 1 && map.get(b) >= 3){// 没有爆牌if (1 * 2 + b * 3 <= max){if (b > y){x = b;y = 1;}}}}return new int[]{x, y};}// 3. A不被选择的情况for (Integer a : map.keySet()) {if (map.get(a) >= 3){for (Integer b : map.keySet()) {if (b != a && map.get(b) >= 2){// 没有爆牌if (a * 3 + b * 2 <= max){// 规则是优先比较牌a的大小,若牌a相同则再比较牌b的大小if (a > x || (a == x && b > y)){x = a;y = b;}}}}}}if (x == 0 && y == 0){return new int[]{0, 0};}else {return new int[]{x, y};}}public static void main(String[] args) {// Add your test cases hereSystem.out.println(java.util.Arrays.equals(solution(9, 34, new int[]{6, 6, 6, 8, 8, 8, 5, 5, 1}), new int[]{8, 5}));System.out.println(java.util.Arrays.equals(solution(9, 37, new int[]{9, 9, 9, 9, 6, 6, 6, 6, 13}), new int[]{6, 9}));System.out.println(java.util.Arrays.equals(solution(9, 40, new int[]{1, 11, 13, 12, 7, 8, 11, 5, 6}), new int[]{0, 0}));}}
复杂度分析与优化
- 时间复杂度:主循环遍历了牌组中的元素并将其计数,复杂度为 (O(n))。随后对计数结果进行两重嵌套的选择(在所有可能的三张和两张牌中查找最大组合),这部分复杂度约为 (O(k^2)),其中 (k) 是去重后牌面值的数量。
- 空间复杂度:使用了一个 HashMap 来存储牌的计数,空间复杂度为 (O(k))。
外链:找到最大“葫芦”组合
相关文章:
找到最大“葫芦”组合
文章目录 问题描述解题思路分析1. 数据预处理2. 特殊情况处理3. 普通情况计算4. 结果输出 Java代码实现复杂度分析与优化 在经典德州扑克中,“葫芦”是一种较强的牌型。它由五张牌组成,其中三张牌面值相同,另外两张牌面值也相同。本文将探讨一…...
shell(9)完结
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
【计算机网络】多路转接之select
系统提供select()来实现多路转接 IO 等 拷贝 -> select()只负责等待,可以一次等待多个fd select()本身没有数据拷贝的能力,拷贝要read()/write()来完成 一、select的使用 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exc…...
数据库-基础理论
文章目录 前言一、ORM框架二、ACID原则三、事务Transaction四、N1问题五、Normalization三范式六、FMEA方法论(Failure Mode and Effects Analysis)七、Profiling和PerformanceSchema查询分析 前言 基础理论 ORM框架、ACID原则、事务Transaction、N1问…...
Linux——1_系统的延迟任务及定时任务
系统的延迟任务及定时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的,不会重复执行 当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中…...
C++ 矩阵旋转
【问题描述】 编写一个程序,读入一个矩阵,输出该矩阵以第一行第一列数字为中心,顺时针旋转90度后的新矩阵,例如: 输入的矩阵为: 1 2 3 4 5 6 顺时针旋转90度后输出的矩阵为: 4 1 5 2 6 3 【输入…...
Docker学习笔记整理
这周不知道写点啥内容做个分享,但还是秉持学会分享的精神,粗略放一些Docker相关的问题和解答吧,后面有机会再补补再深挖深挖o(>﹏<)o 1. 容器VS虚拟机 虚拟机是一种带环境安装的解决方案(资源完全隔离),有以下缺…...
计算机组成原理期末试题三(含答案)
本科生期末试卷 三 一.选择题(每小题1分,共10分) 1.冯诺依曼机工作的基本方式的特点是______。 A 多指令流单数据流 B 按地址访问并顺序执行指令 C 堆栈操作 D 存贮器按内容选择地址 2.在机器数______中&a…...
django+boostrap实现注册
一、django介绍 Django 是一个高级的 Python 网络框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django 负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序,而无需重新开发。 它是免费和开源的&#x…...
C++初阶——类和对象(下)
目录 1、再探构造函数——初始化列表 2、类型转换 3、static成员 4、友元 5、内部类 6、匿名对象 7、对象拷贝时编译器的优化(了解) 1、再探构造函数——初始化列表 1. 构造函数初始化除了使用函数体内赋值,还有一种方式——初始化列表, 初始化列…...
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
随着容器技术的不断成熟,不少企业在开展私有化容器平台建设时,首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器?在往期“虚拟化 vs. 裸金属*”系列文章中,我们分别对比了容器部署在虚拟化平台和物理机上的架…...
idea初始化设置
下载idea: https://www.jetbrains.com/idea/ 安装idea 安装插件: Rainbow BracketsLombokMybatisXSonarLintMaven HelperCodeGeeX(国内AI插件可用) 设置idea注释模板: 设置代码注释模板: https://blo…...
LINUX系统编程之——环境变量
目录 环境变量 1、基本概念 2、查看环境变量的方法 三、查看PATH环境变量的內容 1)不带路径也能运行的自己的程序 a、将自己的程序直接添加到PATH指定的路径下 b、将程序所在的路径添加到PATH环境中 四、环境变量与本地变量 1、本地变量创建 2、环境变量创…...
健康老龄化:适合老年人的播客
什么是播客 什么是播客?好问题。对于那些还不熟悉这个术语的人来说,播客有点像在线广播或电视节目。这是一个可下载、可流式传输的程序,定期发布剧集,时长从几分钟到一个多小时不等。您可以在计算机、智能手机或平板电脑上…...
家庭智慧工程师:如何通过科技提升家居生活质量
在今天的数字化时代,家居生活已经不再只是简单的“住”的地方。随着物联网(IoT)、人工智能(AI)以及自动化技术的快速发展,越来越多的家庭开始拥抱智慧家居技术,将他们的家变得更加智能化、便捷和…...
Milvus概念
非结构化数据、嵌入和 Milvus 非结构化数据(如文本、图像、音频)格式多样,蕴含丰富的语义信息,使其分析变得复杂。为了管理这种复杂性,嵌入技术被用来将非结构化数据转换为数值向量,这些向量能够捕捉数据的…...
为什么调用 setState 而不是直接改变 state
在React中,调用setState方法而不是直接改变state的原因涉及多个方面,包括性能优化、状态管理的可预测性、React的设计理念等。以下是对这些原因的详细解释: 1. 性能优化 异步更新与批量处理:setState是异步执行的,Rea…...
【Python爬虫五十个小案例】爬取豆瓣电影Top250
博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 🪲前言 在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求,…...
cocos creator 3.8 物理碰撞器Collider+刚体RigidBody 8
遇到一个朋友,你来就行的朋友,我过去了,管吃管住,这样的朋友真的很难求。 最近离职了,很难想象,一份策划书一天能给你改n次,一周能郁闷,上一个功能没搞完,让你搞下一个功…...
Python爬取豆瓣电影全部分类数据并存入数据库
在当今数字化的时代,网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天,我就来和大家分享一段有趣的代码,它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。 结果展示(文末附完整代码): 目…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
