LeetCode刷题日记2020/8/22
题目 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的更多相关文章
- Leetcode | 刷题日记(1)
本文记录个人刷题记录 推荐两个刷题网站: 地址:https://leetcode.com/ 另外一个地址:http://www.lintcode.com/ 1.Write a SQL query to ...
- C#LeetCode刷题-字典树
字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树) 48.6% 中等 211 添加与搜索单词 - 数据结构设计 39.9% 中等 212 单词搜索 II 27.9% ...
- C#LeetCode刷题-设计
设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制 33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索 ...
- C#LeetCode刷题-树
树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历 61.6% 中等 95 不同的二叉搜索树 II 43.4% 中等 96 不同的二叉搜索树 51.6% 中等 98 验证二叉搜索树 ...
- C#LeetCode刷题-栈
栈篇 # 题名 刷题 通过率 难度 20 有效的括号 C#LeetCode刷题之#20-有效的括号(Valid Parentheses) 33.0% 简单 42 接雨水 35.6% 困难 71 简 ...
- C#LeetCode刷题-动态规划
动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% ...
- C#LeetCode刷题-字符串
字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) ...
- C#LeetCode刷题-双指针
双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.5% 中等 11 盛最多水的容器 43.5% 中等 15 三数之和 16.1% 中等 16 最接近的三数之和 3 ...
- C#LeetCode刷题-数学
数学篇 # 题名 刷题 通过率 难度 2 两数相加 29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 ...
- C#LeetCode刷题-链表
链表篇 # 题名 刷题 通过率 难度 2 两数相加 29.0% 中等 19 删除链表的倒数第N个节点 29.4% 中等 21 合并两个有序链表 C#LeetCode刷题之#21-合并两个有序链 ...
随机推荐
- 【HZERO】班翎工作流
班翎工作流 工作流流程 流程分类定义 接口管理 long类型写0 字符串写空 流程定义[画流程图] 人工节点-添加审批人规则 空-全局事件-选回调接口 我的待办 流程平台-我参与的流程 发起流程:wo ...
- GitHub CEO发文:严格限制俄罗斯获取侵略性军事能力所需要的技术
前几天,在微信群里就有小伙伴发了一些关于GitHub将限制俄罗斯开发人员使用开源软件的消息,引起程序员圈子的热烈讨论. 就在不久前,GitHub CEO在GitHub官方博客发文阐述了对乌克兰战争的回 ...
- 版本升级 | 兼容VSCode及全系IDE,代码风险一键查询
OpenSCA插件上新啦~ Jetbrains IDE插件全新升级,很多朋友提了需求的VSCode咱也支持上啦~ 当然,CEC-IDE也是兼容的(手动狗头). OpenSCA-VSCode-plugi ...
- java 将字符串变成小写 单引号内的字符串大小写不变
public static void main(String[] args) { String str = "asdfFFFSSDAF'aaaaAAA','132213'"; Sy ...
- springboot+dubbo+myBatis实现微服务集成
springboot+dubbo+myBatis实现微服务集成 代码下载:https://download.csdn.net/download/typ1805/10485048 微服务架构成了当下的技 ...
- Canvas实现画布的缩放
主要介绍三种方式: 首先创建一个index.html文件 <!DOCTYPE html> <html lang="en"> <head> < ...
- spring--AOP通知类型有哪些
Spring AOP(Aspect-Oriented Programming,面向切面编程)提供了五种类型的通知(advice),这些通知定义了切面(aspect)是在目标对象的方法执行的哪个点被应用 ...
- 【转】C语言表驱动法编程实践
来源:C语言表驱动法编程实践(精华帖,建议收藏并实践) (qq.com) 数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明.编程的核心是数据结构,而不是算法. --R ...
- 【Printf】CubeMX生成MDK工程实现printf功能注意点
重定向printf int fputc(int ch, FILE *f) { /* Write a character to the USART */ USART1->DR = ch; /* L ...
- 【TouchGFX】visual studio 工程中 SIMULATOR 宏定义位置