每日一题算法:2020年8月22日 [24 点游戏] judgePoint24

2020年8月22日 24 点游戏 judgePoint24

在这里插入图片描述

class Solution {
   
    public boolean judgePoint24(int[] nums) {
   

    }
}

解题思路:

这道题我一开始的思路是用列举所有可能的方式来判断是否能够凑成24点,但是如果要列举的话代码会写得很长,我也没想到什么方法可以简便地列举出所有可能性。理论上四个数字的组合有4*6=24中组合,再乘以四种符号的组合等于24^2次,在不考虑交换律结合律导致结果一致的情况下,需要列举出578中可能性。

​ 然后我们开始对规则进行分析,首先,我们可以很简单的排列出只存在加减法和乘除法的情况下,此时是没有括号的,此时一共存在8*2中情况,由于加减法和乘除法都存在交换律所以排列顺序并没有影响。

在判断完不存在括号的情况之后,开始考虑存在括号的情况,为什么要存在括号,那就是为了让加减法先于乘除法计算,所以从大体上来观察只存在两种排列可能,1个数和3个数的组合,两个数和两个数的组合。也就是括号包含一个数字没有意义,同理包含四个数字也没有意义。

代码实现失败,是在逻辑太复杂了理不清除,如果让我来写这个游戏肯定是把答案都记在本地数据库里然后直接从数据库里度答案去,应该是无解的情况比较少,我就把所有无解的答案写到数据库中去。

是在解不出我去看了答案,答案的思路清晰多了,我在说一下我对答案的理解。

关键点只有一个,思考游戏的本质,找到如何使用递归的入口,是从4个数中找出两个数,求这两个数能够生成的所有可能数,应该是有6种,然后将这个数和其他两个数加入新的数组,进行下一轮计算,如果能够想明白这一点,那么这道题就可以用递归来做了。

class Solution {
   
    static final int TARGET = 24;
    static final double EPSILON = 1e-6;
    static final int ADD = 0, MULTIPLY = 1, SUBTRACT = 2, DIVIDE = 3;

    public boolean judgePoint24(int[] nums) {
   
        List<Double
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值