【LeetCode每日一题】——679.24 点游戏
文章目录
- 一【题目类别】
- 二【题目难度】
- 三【题目编号】
- 四【题目描述】
- 五【题目示例】
- 六【题目提示】
- 七【解题思路】
- 八【时间频度】
- 九【代码实现】
- 十【提交结果】
一【题目类别】
- 回溯
二【题目难度】
- 困难
三【题目编号】
- 679.24 点游戏
四【题目描述】
- 给定一个长度为4的整数数组
cards。你有4张卡片,每张卡片上都包含一个范围在[1,9]的数字。您应该使用运算符['+', '-', '*', '/']和括号'('和')'将这些卡片上的数字排列成数学表达式,以获得值24。 - 你须遵守以下规则:
- 除法运算符
'/'表示实数除法,而不是整数除法。- 例如,
4 /(1 - 2 / 3)= 4 /(1 / 3)= 12。
- 例如,
- 每个运算都在两个数字之间。特别是,不能使用
“-”作为一元运算符。- 例如,如果
cards =[1,1,1,1],则表达式“-1 -1 -1 -1”是 不允许 的。
- 例如,如果
- 你不能把数字串在一起
- 例如,如果
cards =[1,2,1,2],则表达式“12 + 12”无效。
- 例如,如果
- 除法运算符
- 如果可以得到这样的表达式,其计算结果为
24,则返回true,否则返回false。
五【题目示例】
-
示例 1:
- 输入: cards = [4, 1, 8, 7]
- 输出: true
- 解释: (8-4) * (7-1) = 24
-
示例 2:
- 输入: cards = [1, 2, 1, 2]
- 输出: false
六【题目提示】
cards.length == 41 <= cards[i] <= 9
七【解题思路】
- 首先要读懂题意,搞清楚四种运算方式
- 然后使用回溯解决该问题
- 每次取出两个数字,进行相应的运算
- 然后组成新的数组,该数组包括运算后的结果和剩下的数字
- 然后递归重复进行运算
- 如果最后发现满足24点的要求即可返回真,否则返回假
- 有些细节需要注意:
- 注意精度问题,因为是实数运算,所以需要使用浮点类型
- 注意除法中的除数不能为零
- 加法和乘法满足交换律,可以通过剪纸减少计算次数,从而提高效率
- 最后返回结果即可
- 具体细节可以参考下面的代码
八【时间频度】
- 时间复杂度: O ( 1 ) O(1) O(1)
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
class Solution {// 目标值private static final double target = 24;// 误差private static final double deviation = 1e-6;// 四种运算,注意加和乘放在前两位,因为这两种运算满足交换律,方便后续处理private static final int add = 0;private static final int mul = 1;private static final int sub = 2;private static final int div = 3;public boolean judgePoint24(int[] cards) {// 将int数组转成double类型的ListList<Double> cardList = new ArrayList<>();for (int card : cards) {cardList.add((double)card);}// 返回最终结果return dfs(cardList);}// 使用回溯判断满足运算结果为24的情况private boolean dfs(List<Double> cards) {// 边界条件if (cards.size() == 0) {return false;}// 返回结果if (cards.size() == 1) {return Math.abs(cards.get(0) - target) < deviation;}// 任取数组中的两个数for (int i = 0; i < cards.size(); i++) {for (int j = 0; j < cards.size(); j++) {// 取得数不能相同if (i != j) {// 将剩下的数存到新的数组中List<Double> newCards = new ArrayList<>();for (int k = 0; k < cards.size(); k++) {if (k != i && k != j) {newCards.add(cards.get(k));}}// 开始根据四种运算对最外层循环取出的两个数进行运算并将运算结果放到新的数组中for (int l = 0; l < 4; l++) {// 剪枝,满足交换律的运算(比如加和乘)只运算一次,提高效率if (l < 2 && i > j) {continue;}// 加、乘、减、除四种运算double x = cards.get(i);double y = cards.get(j);if (l == add) {newCards.add(x + y);} else if (l == mul) {newCards.add(x * y);} else if (l == sub) {newCards.add(x - y);} else if (l == div) {if (y < deviation) {continue;}newCards.add(x / y);}// 根据当前运算结果进行下一次运算if (dfs(newCards)) {return true;}// 回溯,开始使用下一种运算符进行运算newCards.remove(newCards.size() - 1);}}}}// 所有情况都没满足return false;}
}
- Python语言版
class Solution:def judgePoint24(self, cards: List[int]) -> bool:# 目标值target = 24# 误差deviation = 1e-6# 四种运算,注意加和乘放在前两位,因为这两种运算满足交换律,方便后续处理add = 0mul = 1sub = 2div = 3# 使用回溯判断满足运算结果为24的情况def dfs(cards):# 边界条件if not cards:return False# 返回结果if len(cards) == 1:return abs(cards[0] - target) < deviation# 任取数组中的两个数for i, x in enumerate(cards):for j, y in enumerate(cards):# 取得数不能相同if i != j:# 将剩下的数存到新的数组中new_cards = list()for k, z in enumerate(cards):if k != i and k != j:new_cards.append(z)# 开始根据四种运算对最外层循环取出的两个数进行运算并将运算结果放到新的数组中for l in range(4):# 剪枝,满足交换律的运算(比如加和乘)只运算一次,提高效率if l < 2 and i > j:continue# 加、乘、减、除四种运算if l == add:new_cards.append(x + y)elif l == mul:new_cards.append(x * y)elif l == sub:new_cards.append(x - y)elif l == div:if abs(y) < deviation:continuenew_cards.append(x / y)# 根据当前运算结果进行下一次运算if dfs(new_cards):return True# 回溯,开始使用下一种运算符进行运算new_cards.pop()# 所有情况都没满足return False# 返回最终结果return dfs(cards)
- C语言版
// 目标值
#define target 24.0
// 误差
#define deviation 1e-6
// 四种运算,注意加和乘放在前两位,因为这两种运算满足交换律,方便后续处理
#define add 0
#define mul 1
#define sub 2
#define div 3// 使用回溯判断满足运算结果为24的情况
bool dfs(double* cards, int size)
{// 边界条件if (size == 0){return false;}// 返回结果if (size == 1){return fabs(cards[0] - target) < deviation;}// 任取数组中的两个数for (int i = 0; i < size; i++){for (int j = 0; j < size; j++){// 取得数不能相同if (i != j){// 将剩下的数存到新的数组中double* newCards = (double*)malloc(sizeof(double) * (size - 1));int newCardsIndex = 0;for (int k = 0; k < size; k++){if (k != i && k != j){newCards[newCardsIndex++] = cards[k];}}// 开始根据四种运算对最外层循环取出的两个数进行运算并将运算结果放到新的数组中double x = cards[i];double y = cards[j];for (int l = 0; l < 4; l++){// 剪枝,满足交换律的运算(比如加和乘)只运算一次,提高效率if (l < 2 && i > j){continue;}if (l == add){newCards[newCardsIndex] = x + y;}else if (l == mul){newCards[newCardsIndex] = x * y;}else if (l == sub){newCards[newCardsIndex] = x - y;}else if (l == div){if (fabs(y) < deviation){continue;}newCards[newCardsIndex] = x / y;}// 根据当前运算结果进行下一次运算,并隐含回溯,开始使用下一种运算符进行运算if (dfs(newCards, newCardsIndex + 1)){free(newCards);return true;}}}}}// 所有情况都没满足return false;
}bool judgePoint24(int* cards, int cardsSize)
{// 将int数组转成double类型的数组double* cardList = (double*)malloc(sizeof(double) * cardsSize);for (int i = 0; i < cardsSize; i++){cardList[i] = (double)cards[i];}// 返回最终结果bool res = dfs(cardList, cardsSize);free(cardList);return res;
}
十【提交结果】
-
Java语言版

-
Python语言版

-
C语言版

相关文章:
【LeetCode每日一题】——679.24 点游戏
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 回溯 二【题目难度】 困难 三【题目编号】 679.24 点游戏 四【题目描述】 给定一个长度为4…...
【Conda】Conda命令详解:高效更新与环境管理指南
目录 1. Conda 更新命令1.1 更新 Conda 核心1.2 更新所有包 2. 严格频道优先级3. 强制安装特定版本4. 创建与管理环境4.1 创建新环境4.2 激活和停用环境4.3 导出和导入环境4.4 删除环境 5. 清理缓存总结 Conda 是一个强大的包管理和环境管理工具,广泛应用于数据科学…...
机器学习:回归模型和分类模型的评估方法介绍
回归模型和分类模型评估方法详解 一、回归模型评估方法 (一)均方误差(MSE) 原理 均方误差是衡量回归模型预测值与真实值之间平均平方差的指标。它通过计算预测值与真实值之差的平方的平均值来评估模型的性能。其数学公式为&…...
担心学术窃取?阿里云加密的AI论文工具帮你锁紧数据!
学术窃取是任何研究人员都需要警惕的问题。随着技术的发展,虽然研究工作变得更加高效,但同时也暴露了更多的安全漏洞,尤其是在数据传输和存储过程中。为了解决这一问题,梅子AI论文工具采用了阿里云加密技术,提供了一个…...
leetcode经典算法题总结
针对leetcode算法题常见的五大经典复杂算法进行如下总结: (1)分治法 把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解…...
运维工具之ansible
Ansible 1.什么是ansible? ansible是基于ssh架构的自动化运维工具,由python语言实现,通过ansible可以远程批量部署等。 2.部署前提 控制端需要安装ansible,被控制端要开启ssh服务,并允许远程登录,被管理主机需要安装py…...
基于 CSS Grid 的简易拖拉拽 Vue3 组件,从代码到NPM发布(1)- 拖拉拽交互
基于特定的应用场景,需要在页面中以网格的方式,实现目标组件在网格中可以进行拖拉拽、修改大小等交互。本章开始分享如何一步步从代码设计,最后到如何在 NPM 上发布。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug…...
【华为HCIP实战课程六】OSPF邻居关系排错网络子网掩码问题,网络工程师
一、链路上网络和掩码引发的OSPF邻居问题 R3和R4已经建立正常的ospf邻居关系 更改IP地址前R3接口IP地址 interface Serial2/0/0 link-protocol ppp ip address 10.1.34.3 255.255.255.240 [R3-Serial2/0/0]ip address 10.1.88.2 255.255.255.240 更改为10.1.88.2 R3和R4虽…...
基础教程 | 用VuePress搭建一个简单的个人博客(附源码)
先附上自己个人博客页面:https://illusionno.github.io/ 源码也在这里:https://github.com/illusionno/my-blog (如果觉得有帮助,可以点颗star✨) 使用的主题是vuepress-theme-reco2.x,并在上面进行了一些调…...
Ubuntu20.04,编译安装BCC
https://github.com/iovisor/bcc/blob/master/INSTALL.md 一、内核配置 In general, to use these features, a Linux kernel version 4.1 or newer is required. In addition, the kernel should have been compiled with the following flags set: CONFIG_BPFy CONFIG_BP…...
# 显卡算力参数对比
显卡算力参数对比 文章目录 显卡算力参数对比A 显卡参数查询B 显卡性能对比: 综合看:T4最具性价比 A 显卡参数查询 查询网址:https://www.techpowerup.com/gpu-specs/ ,以下列出部分: Product NameGPU ChipReleasedB…...
掌握RocketMQ4.X消息中间件(一)-RocketMQ基本概念与系统架构
1 MQ介绍 MQ(Message Quene) : 翻译为 消息队列,别名为 消息中间件,通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,…...
实际开发中,java开发的准备工作
实际开发中,java开发的准备工作 一、IDEA工具环境设置 1、编码设置...
SQL进阶技巧:Order by 中 NULLS LAST特性使用?
目录 1 需求描述 2 数据准备 3 问题分析 4 小结 如果觉得本文对你有帮助,想进一步学习SQL语言这门艺术的,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下: 数字化建设通关指南 专栏 原价99,现在活动价59…...
Redis:cpp.redis++类型操作
Redis:cpp.redis类型操作 stringsetmsetmgetgetrangesetrangeincrbydecrby listlpushrpushlrangellenlpoprpopblpopbrpop setsaddsmemeberssismemberscardspopsintersinterstore hashhsethgethexistshdelhkeyshvalshmsethmget zsetzaddzrangezcardzremzscorezrank 总…...
感冒用药记录
问题描述:国庆感冒了,头昏喉咙不舒服 用药过程: – 前3天:未用药,不好也不坏 – 中间2天:开始喉痛,使用复方氨酚烷胺胶囊【含对乙酰氨基酚】,基本没有效果 – 后面1天:开…...
JMeter性能测试时,如何做CSV参数化
在现代软件开发中,性能测试是保证应用程序在高负载条件下稳定运行的重要环节。为了实现真实场景的测试,参数化技术应运而生。其中,CSV参数化是一种高效且灵活的方法,可以让测试人员通过外部数据文件驱动测试脚本,从而模…...
爬虫获取不同数据类型(如JSON,HTML)的处理方法以及图片相对URL地址的转换
当我们爬取图片的URL地址时,我们要确保它们都是有效的绝对URL,这样就可以直接用这些URL来下载图片了。但是很多时候,它们都不是绝对URL地址,因此我们需要它进行URL转换。 if img_url.startswith(//): 这个条件检查URL是否以//开头…...
Elasticsearch 实战应用
Elasticsearch 实战应用 引言 Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎,能够快速、实时地处理大规模数据,广泛应用于全文搜索、日志分析、推荐系统等领域。在这篇博客中,我们将从 Elasticsearch 的基本概念入手ÿ…...
前端数据加载慢的解决方法
都是和前端性能优化非常类似的做法。 1. 懒加载 (Lazy Loading) 对于图片、视频等资源,或者某些组件,在用户滚动到相关区域时再加载,而不是页面一开始就加载所有内容。使用 IntersectionObserver 实现懒加载,或者一些 UI 框架&am…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
