题目 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. 【HZERO】班翎工作流

    班翎工作流 工作流流程 流程分类定义 接口管理 long类型写0 字符串写空 流程定义[画流程图] 人工节点-添加审批人规则 空-全局事件-选回调接口 我的待办 流程平台-我参与的流程 发起流程:wo ...

  2. GitHub CEO发文:严格限制俄罗斯获取侵略性军事能力所需要的技术

    前几天,在微信群里就有小伙伴发了一些关于GitHub将限制俄罗斯开发人员使用开源软件的消息,引起程序员圈子的热烈讨论. 就在不久前,GitHub CEO在GitHub官方博客发文阐述了对乌克兰战争的回 ...

  3. 版本升级 | 兼容VSCode及全系IDE,代码风险一键查询

    OpenSCA插件上新啦~ Jetbrains IDE插件全新升级,很多朋友提了需求的VSCode咱也支持上啦~ 当然,CEC-IDE也是兼容的(手动狗头). OpenSCA-VSCode-plugi ...

  4. java 将字符串变成小写 单引号内的字符串大小写不变

    public static void main(String[] args) { String str = "asdfFFFSSDAF'aaaaAAA','132213'"; Sy ...

  5. springboot+dubbo+myBatis实现微服务集成

    springboot+dubbo+myBatis实现微服务集成 代码下载:https://download.csdn.net/download/typ1805/10485048 微服务架构成了当下的技 ...

  6. Canvas实现画布的缩放

    主要介绍三种方式: 首先创建一个index.html文件 <!DOCTYPE html> <html lang="en"> <head> < ...

  7. spring--AOP通知类型有哪些

    Spring AOP(Aspect-Oriented Programming,面向切面编程)提供了五种类型的通知(advice),这些通知定义了切面(aspect)是在目标对象的方法执行的哪个点被应用 ...

  8. 【转】C语言表驱动法编程实践

    来源:C语言表驱动法编程实践(精华帖,建议收藏并实践) (qq.com) 数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明.编程的核心是数据结构,而不是算法. --R ...

  9. 【Printf】CubeMX生成MDK工程实现printf功能注意点

    重定向printf int fputc(int ch, FILE *f) { /* Write a character to the USART */ USART1->DR = ch; /* L ...

  10. 【TouchGFX】visual studio 工程中 SIMULATOR 宏定义位置