[Leetcode][第679题][JAVA][24点游戏][回溯][暴力]
【问题描述】[困难]
【解答思路】
回溯
时间复杂度:O(1) 空间复杂度:O(1)
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> list = new ArrayList<Double>();for(int num:nums){list.add((double) num);}return solve(list);}public boolean solve(List<Double> list) {// list空,没有可计算的,证明无解if (list.size() == 0) {return false;}if(list.size() == 1){// le-6是浮点计算的精度误差,这里判断误差小于1e-6,这样就是正确结果return Math.abs(list.get(0) - TARGET)< EPSILON;}// k的四种计算情况int size = list.size();// 性能优化,当k<2时,对于+ or *不考虑顺序,// 所以k<2 时,j > i与i > j的结果相同,所以有部分不用考虑for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(i!=j){List<Double> list2 = new ArrayList<Double>();for(int k =0;k<size;k++){if(k!=i && k!=j){list2.add(list.get(k));}}for(int k=0;k<4 ;k++){if(k<2 && i>j){continue;}if(k==ADD){list2.add(list.get(i)+list.get(j));} else if (k == MULTIPLY) {list2.add(list.get(i) * list.get(j));} else if (k == SUBTRACT) {list2.add(list.get(i) - list.get(j));} else if (k == DIVIDE) {// 避免除数为0if(Math.abs(list.get(j))<EPSILON){continue;}else{list2.add(list.get(i) /list.get(j));}}// 在这次计算后,判断剩下的元素是否符合要求// 每次缩小计算范围if(solve(list2)){return true;}// 移除最后一个计算结果,因为最后的记过不满足要求// 就是一种回溯方法,将前面添加的结果删除list2.remove(list2.size()-1);}}}}return false;}
}
【总结】
1. 24点 回溯暴力解决 套娃 回溯 9216种可能
2.细节
static final double EPSILON = 1e-6; // 1x10^(-6) 用来抵消浮点运算中因为误差造成的相等无法判断的情况。
转载:https://leetcode-cn.com/problems/24-game/solution/24-dian-you-xi-by-leetcode-solution/
[Leetcode][第679题][JAVA][24点游戏][回溯][暴力]相关推荐
- [Leetcode][第78题][JAVA][子集][位运算][回溯]
[问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...
- [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]
[问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...
- [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]
[问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...
- [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]
[问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...
- [Leetcode][第216题][JAVA][数组之和3][回溯]
[问题描述][中等] [解答思路] 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer> ...
- [Leetcode][第81题][JAVA][N皇后问题][回溯算法]
[问题描述][困难] [解答思路] 1. 主副对角线列 标记 复杂度 import java.util.ArrayDeque; import java.util.ArrayList; import j ...
- [剑指offer]面试题第[35]题[Leetcode][第138题][JAVA][复杂链表的复制][暴力][HashMap][复制链表]
[问题描述][中等] [解答思路] 1. 暴力 直接复制 将链表从头节点一个一个复制下去, 在根据记录的总长度num,遍历原来的每个节点的random到尾节点个数count,然后顺序遍历找到新链表的该 ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- [Leetcode][第77题][JAVA][组合][回溯]
[问题描述][中等] [解答思路] 1. 回溯 class Solution {List<List<Integer>> lists = new ArrayList<> ...
最新文章
- maven如何在eclipse上加载
- 一个Portal处理流程
- python3 计算时间间隔
- python访问服务器注册表,如何在Python中使用写入权限打开Windows注册表
- 优化gradle下载引用jar速度慢或者出错的问题
- tar 压缩与解压缩打包命令
- 智能家居 (2) ——设计模式的引入
- JQuery真的不难~第六回 JQ中的异步调用方式
- 软件工程练习:模块化,单元测试,回归测试,TDD
- 如何产生cpk图形_PPK与CPK定义,差异分析及计算
- ELK收集docker日志
- .condarc(conda 配置文件)、换国内源
- explorer.exe应用程序错误,该内存不能为READ
- ES6新特性总结 一
- vs2019中git提交代码的步骤
- HDU-4747 Mex
- 有些打不开的国外网页
- 情侣的网站代码java_GitHub - 90x64/lovers-website: 程序员的情侣网站 (programmer's website of lovers)...
- sina 股票接口 2022.1.21 更新
- 关于北洋壳的网友问题
热门文章
- data-role参数表:
- python在eclipse下中文乱码问题zz
- hession调用json解析异常 com.caucho.hessian.io.HessianProtocolException: expected integer at 0x74 java.util
- 计算机科学与技术班级口号八字,班级的八字口号
- 万能点位图软件_红色网格衣+很多漂亮的花边像素图,绣手帕花边的十字绣图...
- 微信小程序结合Java后端实现登录注册
- 原来js的parseInt函数还可以这样用
- 使用jdbc执行SQL实现登录查询2-避免SQL注入版
- java深度克隆大数据_Java - 深拷贝技巧
- 【Makefile由浅入深完全学习记录2】初识 makefile 的结构