题目 24点程序

描述

你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。

示例 1:

输入: [4, 1, 8, 7]

输出: True

解释: (8-4) * (7-1) = 24

示例 2:

输入: [1, 2, 1, 2]

输出: False

注意:

除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。

每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1] 作为输入时,表达式 -1 - 1 - 1 - 1 是不允许的。

你不能将数字连接在一起。例如,输入为 [1, 2, 1, 2] 时,不能写成 12 + 12 。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/24-game

解析

知识点: 回溯

处理逻辑是从4张牌里面进行选择,每次由2张牌合为一张牌,进行下一轮处理,所以总共有3轮。

第一轮:从4张牌里面任意选两个进行4种操作,

第二轮:从3张牌里面任意选两个进行4种操作,

第三轮:从2张牌选两个进行4中操作

可能的选择和操作总数是,(12 * 4) * (6 * 4) * (2 * 4) = 9216种

12 * 4 就是4张牌里面任意选前2个数的组合,这两个数字进行4种操作

6 * 4 就是3张牌里面任意选前2个数的组合,这两个数字进行4种操作

2 * 4 就是2张牌里面任意选前2个数的组合,已经4种操作后的结果。

以上都考虑全排列的结果,每次选择都考虑顺序的不同在除法和减法时候的不同,乘法和加法不影响。

举例说明:假设为1 2 3 4 四个数字

4张牌全排列是4的阶乘,4!= 24,由于要每次取两个数字,

两个一样的数字如下会有重复的排列需要去重,

后面的数字部分是下一轮要考虑的,第一轮不考虑;

1 2 3 4, 1 2 4 3, 1 3 2 4, 1 3 4 3, 1 4 2 3, 1 4 3 2,

2 1 3 4, 2 1 4 3, 2 3 1 4, 2 3 4 1, 2 4 1 3, 2 4 3 1,

3 1 2 4, 3 1 4 2, 3 2 1 4, 3 2 4 1, 3 4 1 2, 3 4 2 1,

4 1 2 3, 4 1 3 2, 4 2 1 3, 4 2 3 1, 4 3 1 2, 4 3 2 1

第二轮循环假设为 2 3 4 三个数字,可以看到有6中情况

2 3 4, 2 4 3, 3 2 4, 3 4 2, 4 2 3, 4 3 2

第三轮循环假设为 4 6 两个数字,所以是两种情况,但是里面 + 和 * 的结果是一样的,当时 / 和 - 会不同

4 6,6 4

代码如下:

class Solution {
public boolean judgePoint24(int[] nums) {
ArrayList<Double> A = new ArrayList<>();
for (int v: nums) A.add((double) v);
return solve(A);
} private boolean solve(ArrayList<Double> nums) {
// 没有可计算的,证明无解
if (nums.size() == 0) return false;
// le-6是浮点计算的精度误差,这里判断误差小于1e-6,这样就是正确结果
if (nums.size() == 1) return Math.abs(nums.get(0) - 24) < 1e-6; for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums.size(); j++) {
if (i != j) {
// 找到当前排列下的其他两个元素
ArrayList<Double> nums2 = new ArrayList<>();
for (int k = 0; k < nums.size(); k++) {
if (k != i && k != j) {
nums2.add(nums.get(k));
}
} // k的四种计算情况
for (int k = 0; k < 4; k++) {
// 性能优化,当k<2时,对于+ or *不考虑顺序,
// 所以k<2 时,j > i与i > j的结果相同,所以有部分不用考虑
if (k < 2 && j > i) continue;
if (k == 0) nums2.add(nums.get(i) + nums.get(j));
if (k == 1) nums2.add(nums.get(i) * nums.get(j));
if (k == 2) nums2.add(nums.get(i) - nums.get(j));
// 避免除数为0
if (k == 3) {
if (nums.get(j) != 0) {
nums2.add(nums.get(i) / nums.get(j));
} else {
continue;
}
}
// 在这次计算后,判断剩下的元素是否符合要求
// 每次缩小计算范围
if (solve(nums2)) return true;
// 移除最后一个计算结果,因为最后的记过不满足要求
// 就是一种回溯方法,将前面添加的结果删除
nums2.remove(nums2.size() - 1);
}
}
}
}
return false;
}
}

LeetCode刷题日记2020/8/22的更多相关文章

  1. Leetcode | 刷题日记(1)

    本文记录个人刷题记录 推荐两个刷题网站: 地址:https://leetcode.com/ 另外一个地址:http://www.lintcode.com/ 1.Write a SQL query to ...

  2. C#LeetCode刷题-字典树

    字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树)   48.6% 中等 211 添加与搜索单词 - 数据结构设计   39.9% 中等 212 单词搜索 II   27.9% ...

  3. C#LeetCode刷题-设计

    设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制   33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索 ...

  4. C#LeetCode刷题-树

    树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历   61.6% 中等 95 不同的二叉搜索树 II   43.4% 中等 96 不同的二叉搜索树   51.6% 中等 98 验证二叉搜索树 ...

  5. C#LeetCode刷题-栈

    栈篇 # 题名 刷题 通过率 难度 20 有效的括号 C#LeetCode刷题之#20-有效的括号(Valid Parentheses) 33.0% 简单 42 接雨水   35.6% 困难 71 简 ...

  6. C#LeetCode刷题-动态规划

    动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串   22.4% 中等 10 正则表达式匹配   18.8% 困难 32 最长有效括号   23.3% 困难 44 通配符匹配   17.7% ...

  7. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.6% 中等 5 最长回文子串   22.4% 中等 6 Z字形变换   35.8% 中等 8 字符串转整数 (atoi)   ...

  8. C#LeetCode刷题-双指针

    双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.5% 中等 11 盛最多水的容器   43.5% 中等 15 三数之和   16.1% 中等 16 最接近的三数之和   3 ...

  9. C#LeetCode刷题-数学

    数学篇 # 题名 刷题 通过率 难度 2 两数相加   29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 ...

  10. C#LeetCode刷题-链表

    链表篇 # 题名 刷题 通过率 难度 2 两数相加   29.0% 中等 19 删除链表的倒数第N个节点   29.4% 中等 21 合并两个有序链表 C#LeetCode刷题之#21-合并两个有序链 ...

随机推荐

  1. MAC SAP for JAVA配置

    一.自定义应用程序服务器配置 conn = /H/<SAP路由器服务器地址(如果有)>/S/3299 /H/<SAP服务器地址>/S/32<Instance_no> ...

  2. Codeforces Round #671 (Div. 2) (A - B、D1题)

    比赛链接:https://codeforces.com/contest/1419 https://codeforces.com/contest/1419/problems A. Digit Game ...

  3. 前端科普系列(5):ESLint - 守住优雅的护城河

    作者:Morrain [前端科普系列]帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作. ...

  4. mysql备份恢复总结

    mysqldump备份注:例子中的语句都是在mysql5.6下执行------------------基础------------------------一.修改my.cnf文件 vi /etc/my ...

  5. ttf转eot

    Webfont Generator https://www.fontsquirrel.com/tools/webfont-generator 使用@font-face显示web自定义字体,字体获取工具 ...

  6. vue结合element-ui实现多层复选框checkbox

    1.需求如上图所以: html相关代码如下: 1 <div class="intent-course-wrapper"> 2 <div class="c ...

  7. zzuli 1902: 985的因子对难题

    ***这道题明显是在卡时间,类比快速打素数表的算法,*** #include<iostream> #include<cstdio> #include<cstring> ...

  8. SVN被锁定的处理方案

    当svn提交文件时,如下提示,文件被锁定:

  9. 解决ssh远程登录Too many authentication failures报错

    远程登录失败,报错,造成无法登录的情况,原因为:多次输入密码失败导致登录异常. 解决方案: 1.登录主机:vi /etc/ssh/sshd_config 2.找到MaxAuthTries,修改数值变大 ...

  10. python进阶(4)--字典

    文档目录: 一.一个简单的字典二.字典-增删改三.遍历字典四.字典嵌套 ---------------------------------------分割线:正文------------------- ...