文巾解题 679. 24 点游戏
1 题目描述
2 解题思路
2.1 遍历所有可能情况
我们先找出四张牌所有可能的排列组合。
然后对于每一种排列组合,我们先提出排列组合中最前面的两个数。然后对这两个数进行加\减\乘\除操作。将结果放入我们当前考虑的排列组合中。
此时排列组合中有三个元素:原来的后两个元素。和前两个元素进行数学计算后的结果。
慢的操作是对这三个数组成的序列,再求它们 的排列组合。但实际上后两个数的顺序我们是可以固定的。也就是说,如果我们接下来提取出来的两个数。有前两个数运算后的结果,那么这个结果可能在运算符的左边,也可能在运算符的右边。这两种情况我们都需要考虑
然后三个数组成的序列,经过上面一部变成了两个数。同第三步的考虑一样。两个操作数哪个在运算符的左边,哪个在右边。我们都需要进行讨论和考虑。
还有一个tips。因为这种方法我们没有排除掉除以0 的情况。为了防止除0报错,进行除法的时候,我们需要对被除数加上一个很小的数值。
class Solution:def judgePoint24(self, cards: List[int]) -> bool:ret=[]for i in cards:tmp=copy.deepcopy(cards)tmp.remove(i)for j in tmp:tmp1=copy.deepcopy(tmp)tmp1.remove(j)for k in tmp1:tmp2=copy.deepcopy(tmp1)tmp2.remove(k)l=tmp2[0]ret.append([i,j,k,l])
#四张牌所有的排列组合
'''
求排列组合的大致思想是:
我们先从四个元素组成的序列中提取一个;
然后从不含这个元素的三元素序列中提取一个;
然后是两个中选一个,最后就是另外的一个
'''def judge2(ab,cd):#print(ab,cd)return((abs(ab+cd-24)<0.001)or(abs(ab*cd-24)<0.001)or(abs(ab-cd-24)<0.001)or(abs(ab/(cd+0.0000001)-24)<0.001)or(abs(cd-ab-24)<0.001)or(abs(cd/(ab+0.0000001)-24)<0.001))
#三元序列中提取两个进行计算,得到的结果和序列中剩余的一个,这两个数能否通过某种运算达到24def judge3(ab,c,d):#print(ab,c,d)return( judge2(ab+c,d) or judge2(ab-c,d)orjudge2(ab*c,d)orjudge2(ab/(c+0.0000001),d)orjudge2(c/(ab+0.0000001),d)orjudge2(c-ab,d)orjudge2(ab,c+d)orjudge2(ab,c-d)orjudge2(ab,c*d)orjudge2(ab,c/(d+0.0000001)))
#四元序列中提取两个进行运算,得到的结果和序列中剩余的两个,这三个数能否通过什么方法使结果到24def judge4(a,b,c,d):return( judge3(a+b,c,d) or judge3(a-b,c,d)orjudge3(a*b,c,d)orjudge3(a/(b+0.0000001),c,d))
#四个数能否通过某些操作使得结果为24for i in ret:if(judge4(i[0],i[1],i[2],i[3])==True):return(True)return(False)
2.2 方法2 :递归
class Solution:def judgePoint24(self, nums: List[int]) -> bool:TARGET = 24EPSILON = 1e-6ADD, MULTIPLY, SUBTRACT, DIVIDE = 0, 1, 2, 3def solve(nums: List[float]) -> bool:if len(nums) == 1:return abs(nums[0] - TARGET) < EPSILON
#只剩下一个数了,就判断这个数和24之间的差距是否在临界差距以内
#在的话,那么说明可以通过运算得到24for i, x in enumerate(nums):for j, y in enumerate(nums):if i != j:
#从nums中找不同的两个数(区别于方法2.1的思路)newNums = list()for s, z in enumerate(nums):if s != i and s != j:newNums.append(z)
#找第三个数for k in range(4):if k < 2 and i > j:continue
'''
加和乘运算,而且第一个运算数比第二个大
这说明之前在x等于第二个运算数的时候,x+y 或者x*y已经计算过了
所以不用再次计算,直接继续循环
'''if k == ADD:newNums.append(x + y)elif k == MULTIPLY:newNums.append(x * y)elif k == SUBTRACT:newNums.append(x - y)elif k == DIVIDE:if abs(y) < EPSILON:continuenewNums.append(x / y)if solve(newNums):return True
#如果x,y运算的结果和nums中剩下的两个数组成的三个数可以算出24,那么返回TruenewNums.pop()
'''
不然的话,在三元素序列中,把当前算的这个达不到24的x,y运算结果pop出来,
然后看下一个操作符算出来的X,Y结果,和nums中剩下的两个元素组成的三元素序列满足不满足条件要求
'''return Falsereturn solve(nums)
2.3 方法3:dfs
class Solution:def judgePoint24(self, cards: List[int]) -> bool:def dfs(nums):if len(nums) == 1:return abs(nums[0] - 24) < 0.00001
#序列中只有最后一个数了,进行判断for i in range(len(nums)-1):for j in range(i+1, len(nums)):x, y = nums[i], nums[j]
#提取两个不一样的数(这里假设x在序列中的排位一定在y前面)
#所以之后考虑减法和除法的时候,需要分别考虑x和y在除/减数和被除/减数的情况rst = nums[:i] + nums[i+1:j] + nums[j+1:]
#x和y元素以外的元素拼成一个序列a = dfs(rst + [x + y])b = dfs(rst + [x - y])c = dfs(rst + [y - x])d = dfs(rst + [x * y])e = (y != 0) and dfs(rst + [x / y])f = (x != 0) and dfs(rst + [y / x])
#将x,y经过不同操作数的结果放到rst中,拼接而成的序列继续进行dfsif a or b or c or d or e or f:return Truereturn Falsereturn dfs(cards)
文巾解题 679. 24 点游戏相关推荐
- 文巾解题 面试题 01.04. 回文排列
1 题目描述 2 解题思路 2.1 哈希表 创建一个哈希表,记录每个元素出现的次数.如果出现次数为奇数的元素只有一个或者没有,那么就是一个回文排列 class Solution:def canPerm ...
- 文巾解题 15. 三数之和
1 题目描述 2 解题思路 2.1 使用两数之和函数 这种做法目前超时了,如果大家有想到合适的减时间/剪枝的方法,欢迎私信or评论~ 两数之和的方法见文巾解题 1. 两数之和_刘文巾的博客-CSDN博 ...
- 文巾解题 342. 4的幂
1 题目描述 2 解题思路 2.1 方法1 判断log函数的结果是不是整数 class Solution:def isPowerOfFour(self, n: int) -> bool:if(n ...
- 文巾解题 477. 汉明距离总和
1 题目描述 2 解题思路 2.1 暴力两两比较 两个数字之间的汉明距离可以使用 文巾解题 461. 汉明距离_刘文巾的博客-CSDN博客 中的任何一种方法,但是因为这个是两两比较,时间复杂度比较高, ...
- 文巾解题 1035. 不相交的线
1 题目描述 2 解题思路 k条互不相交的直线分别连接了数组 nums1和nums2的 k 对相等的元素,而且这 k 对相等的元素在两个数组中的相对顺序是一致的,因此,这 k 对相等的元素组成的序列即 ...
- 679. 24 点游戏
链接:679. 24 点游戏 题解: https://leetcode-cn.com/problems/24-game/solution/ying-gai-shi-man-hao-li-jie-de- ...
- ACM. HJ67 24点游戏算法 679. 24 点游戏
HJ67 24点游戏算法 ●● 679. 24点游戏 ●●● 描述 给定一个长度为4的整数数组 cards .你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的数字.您应该使用运算符 ['+ ...
- Leetcode 679. 24 点游戏 (暴力)
题目链接:679. 24 点游戏 这个题一开始,估摸估摸着数据量,感觉应该能用暴力暴力出来,只可惜自己写的暴力有问题,自己一开始的思想是,将4个数分为两两一组组,每组做加减乘除运算-很天真对吧现在看起 ...
- 文巾解题 278. 第一个错误的版本
1 题目描述 2 解题思路 二分查找见:二分查找详解_刘文巾的博客-CSDN博客 class Solution(object):def firstBadVersion(self, n):left=1r ...
最新文章
- url传递中文的解决方案
- Chmod 777到一个文件夹和所有内容[重复]
- maven 安装m2e 报错
- kie-api_7.0上的新KIE持久性API
- SSL/TLS捕包分析
- 【Kafka】kafka消费组查看lag
- Active Record Query Interface 数据查询接口(界面) 看到第8节。
- 区块链 以太坊 全局变量 状态变量 局部变量 是什么 区别
- XSS fuzzing 工具
- C语言预处理指令-单片机必备技能
- 2022年湖南省自考考试学前教育行政与管理练习题及答案
- 数据结构第一节课感受
- OpenCV之视频截取
- 如何检索或下载国内外论文、文献
- JVM中垃圾收集算法总结
- 谷歌帮——中国最牛的创业帮派
- UMAX系统——智能终端的领跑者
- 微信提醒事项功能怎么设置
- Android FileProvider配置和当引用包内已经含有FileProvider的多节点解决办法
- 《诚信》——赤兔之死
热门文章
- CAS SSO对手机应用支持的一种思路
- Visual Studio使用技巧,创建自己的代码片段
- Lync常识之Lync客户端有哪些
- oracle 查看索引类别以及查看索引字段被引用的字段方法
- BLE Mesh(1)—— 简述
- SecureCRT中Python脚本编写学习指南
- gb2312 requests乱码_不要相信requests返回的text
- vue重启node_【ts】vue-typescript-admin类型any仍然报错
- 测试晶面间距软件_超逼真动图解析常用15大分析测试仪器,必收藏!SEM, 红外,紫外,核磁,质谱,TEM,ICP等...
- mysql当前时间加一天_MySQL 的加锁处理,你都了解的一清二楚了吗?