24点游戏679

题目描述:
给定一个长度为4的整数数组 cards 。你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的
数字。您应该使用运算符 ['+', '-', '*', '/'] 和括号 '(' 和 ')' 将这些卡片上的数字排
列成数学表达式,以获得值24。你须遵守以下规则:
(1)除法运算符 '/' 表示实数除法,而不是整数除法。例如, 4 /(1 - 2 / 3)= 4 /(1 / 3)= 12 。
(2)每个运算都在两个数字之间。特别是,不能使用 “-” 作为一元运算符。例如,如果 cards =[1,1,1,1] ,则表达式 “-1 -1 -1 -1” 是 不允许 的。
(3)你不能把数字串在一起例如,如果 cards =[1,2,1,2] ,则表达式 “12 + 12” 无效。
如果可以得到这样的表达式,其计算结果为 24 ,则返回 true ,否则返回 false。输入: cards = [4, 1, 8, 7]
输出: true
解释: (8-4) * (7-1) = 24输入: cards = [1, 2, 1, 2]
输出: falsecards.length == 4
1 <= cards[i] <= 9

way:一开始有4个数字,按顺序选出2张A42,有12种顺序,然后将拿出的2张牌做4种运算中的一种运算得到一个结果牌,此时加上剩下的2张牌,还有3张牌,然后从3张牌有A32,6种顺序拿出2张牌做4种运算中的一种得到一个结果牌,此时加上剩下的1张牌,还有2张牌,最后这2张牌有A22的2种顺序进行4种运算中的一种运算,得到最后的结果牌,如果最后得到的结果是24,那么就可以,否则不能。为什么是A42而不是C42这种方式拿牌呢,因为除法和减法运算与数的运算顺序是有关的,所以要有顺序的拿,然后为了防止A+B,A*B, 与B+A,B * A 这样得到重复的运算结果,所以加了判断去除重复。12*6*2*4*4*4=9216种可能性。

我觉得此题的关键之处在于知道怎样去选牌,去选运算,减少到最后一个结果值,没那么难的啦!

看看别人说的多好!

#define ADD 0
#define SUB 1
#define MUL 2
#define DIV 3
double EPLISION =1e-6;class Solution {
public:bool solve(vector<double>& cards){if(cards.size()==0 ) return false;if(cards.size()==1)  return abs(cards[0]-24)<EPLISION;int n = cards.size();for(int i=0; i<n; i++){for(int j=0; j<n; j++){//顺序的选2个数if(i!=j){vector<double>nums;for(int x=0; x<n; x++){//将除了运算的2个数之外的其他数字push进nums中if(x!=i && x!=j){nums.push_back(cards[x]);}}//从4种运算中选取一种运算for(int op=0; op<4; op++){if((op==ADD || op == MUL) && j>i) continue;if(op == ADD){nums.push_back(cards[i]+cards[j]);}else if(op == SUB){nums.push_back(cards[i]-cards[j]);}else if(op == MUL){nums.push_back(cards[i]*cards[j]);}else{//除数是0时,continue掉if(abs(cards[j])<EPLISION) continue;nums.push_back(cards[i]/cards[j]);}if(solve(nums)) return true;//去除当前选择的运算结果nums.pop_back();}}}}return false;}bool judgePoint24(vector<int>& cards) {vector<double>cards2;for(int i=0; i<cards.size(); i++){cards2.push_back((double)cards[i]);}return solve(cards2);}
};

时间复杂度:O(1)。一共有 9216 种可能性,对于每种可能性,各项操作的时间复杂度都是 O(1),因此总时间复杂度是 O(1)。

空间复杂度:O(1)。空间复杂度取决于递归调用层数与存储中间状态的列表,因为一共有 4个数,所以递归调用的层数最多为 4,存储中间状态的列表最多包含 4个元素,因此空间复杂度为常数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701409.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css实现围绕中心进行圆形旋转

效果如下 通过css animation属性能实现以上效果 先试用定位&#xff0c;将每一项设置一个初始位置 {cursor: pointer;left: 50%;width: 144px;height: 144px;display: flex;align-items: center;justify-content: center;margin-left: -72px;top: 228px;position: absolute;a…

莆田市C++专项选拔第二轮题4

题4&#xff1a;变换阵型 【题目描述】 盛隆同学刚学完C的二维数组和函数部分&#xff0c;于是他自己写了2个函数对二维数组进行练习。两个函数如下&#xff1a; int n, a[1005][1005]; // 注意&#xff0c;这里的n和数组a是全局变量 void f1() {for (int i 1; i < n; i)…

Docker下载镜像出现“missing signature key”如何解决?

“missing signature key” 通常与 Docker 配置有关&#xff0c;具体是 Docker 试图验证镜像的签名但未能找到相应的密钥。这种情况可能发生在启用了 Docker Content Trust (DCT) 的环境中&#xff0c;DCT 是一种安全功能&#xff0c;要求所有镜像必须有签名才能拉取。 原因 …

【Flutter】极光推送配置流程(VIVO/OPPO/荣耀厂商通道) 章三

相关文章 推送配置共三篇(如下链接) 【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一 【Flutter】极光推送配置流程(小米厂商通道) 章二 【Flutter】极光推送配置流程(VIVO/OPPO/荣耀厂商通道) 章三 前言 很高兴大家来看小编写的文章&#xff5e;&#xff5e; 继【…

Python爬虫——如何使用urllib的HTTP基本库

怎样通过 urllib库 发送 HTTP 请求&#xff1f; urllib库主要由四个模块组成: urllib.request 打开和读取 URLurllib.error 包含 urllib.request 抛出的异常urllib.parse 用于解析 URLurllib.robotparser 用于解析 robots.txt 文件 1. 使用urllib.parse解析URL 使用urlparse(…

centos7.9安装PHP运行环境

MySQL安装 报错&#xff1a;源 "MySQL 8.0 Community Server" 的 GPG 密钥已安装&#xff0c;但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。 解决&#xff1a; yum install mysql-server -y --nogpgcheck 查询初始密码 grep temporary password /var…

数据中心网络随想-电路交换

数据中心网络扩容并不容易&#xff0c;涉及设备上架&#xff0c;切换等又硬又大的动作&#xff0c;期间对所有应用都会产生影响&#xff0c;所以理论上 “加钱加硬件” 这种看起来很简单的事实际上真不如 “写一个随时部署升级的端到端拥塞控制算法” 更容易实施。 傍晚绕小区…

警惕!红火蚁危机升级:已入侵我国12省份,扩散速度惊人

近年来&#xff0c;红火蚁这一外来入侵物种在我国呈现出了令人担忧的扩张态势&#xff0c;其危害性和扩散速度之迅猛&#xff0c;已引起了社会各界的广泛关注和政府部门的高度警惕。红火蚁作为一种极具破坏力的生物&#xff0c;不仅会对当地的生态环境造成巨大影响&#xff0c;…

【算法】二分查找——二分查找

本节博客详述“二分查找”并且以例子来进行讨论&#xff0c;有需要借鉴即可。 目录 1.二分查找1.1使用前提1.2模板 2.题目3.题解代码示例4.二分查找的一般模板5.总结 1.二分查找 1.1使用前提 使用的条件&#xff1a;数组具有“二段性”&#xff0c;二段性指的是数组可以根据某…

如何将公众号添加到CSDN个人主页

1. 创作中心- 推广管理 输入个人公众号名字并开启微信公众号推广 2. 将公众号的二维码图片加入拓展信息 个人主页的左下角就能看到推广 如果希望能看到是二维码 操作如下&#xff1a; 写篇文章贴上二维码 然后点击鼠标右键获得此页面链接 &#xff0c;例如我的个人公众号 htt…

MyBatis的注解实现复杂映射开发

xml 配置方式实现复杂映射回顾 ​ 实现复杂映射我们之前可以在映射文件中通过配置来实现&#xff0c;使用注解开发后&#xff0c;我们可以通过 Results 注解&#xff0c;Result 注解&#xff0c;One 注解和 Many 注解组合完成复杂关系的配置。 注解说明Results代替的是标签 …

举个栗子!Tableau 技巧(273):用葡萄干布丁图(Plum Pudding Chart)查看数据

葡萄干布丁图 / Plum Pudding Chart 葡萄干布丁图&#xff08;Plum Pudding Chart&#xff09;源自英国传统的葡萄干布丁&#xff0c;它由多种原料混合而成&#xff0c;每种原料的比例不同&#xff0c;葡萄干布丁图用于展示多种不同类型的数据。 葡萄干布丁图由一系列同心圆环…