【问题描述】[困难]

【解答思路】

回溯

时间复杂度: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点游戏][回溯][暴力]相关推荐

  1. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

  2. [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]

    [问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...

  3. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

    [问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...

  4. [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

    [问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...

  5. [Leetcode][第216题][JAVA][数组之和3][回溯]

    [问题描述][中等] [解答思路] 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer> ...

  6. [Leetcode][第81题][JAVA][N皇后问题][回溯算法]

    [问题描述][困难] [解答思路] 1. 主副对角线列 标记 复杂度 import java.util.ArrayDeque; import java.util.ArrayList; import j ...

  7. [剑指offer]面试题第[35]题[Leetcode][第138题][JAVA][复杂链表的复制][暴力][HashMap][复制链表]

    [问题描述][中等] [解答思路] 1. 暴力 直接复制 将链表从头节点一个一个复制下去, 在根据记录的总长度num,遍历原来的每个节点的random到尾节点个数count,然后顺序遍历找到新链表的该 ...

  8. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  9. [Leetcode][第77题][JAVA][组合][回溯]

    [问题描述][中等] [解答思路] 1. 回溯 class Solution {List<List<Integer>> lists = new ArrayList<> ...

最新文章

  1. maven如何在eclipse上加载
  2. 一个Portal处理流程
  3. python3 计算时间间隔
  4. python访问服务器注册表,如何在Python中使用写入权限打开Windows注册表
  5. 优化gradle下载引用jar速度慢或者出错的问题
  6. tar 压缩与解压缩打包命令
  7. 智能家居 (2) ——设计模式的引入
  8. JQuery真的不难~第六回 JQ中的异步调用方式
  9. 软件工程练习:模块化,单元测试,回归测试,TDD
  10. 如何产生cpk图形_PPK与CPK定义,差异分析及计算
  11. ELK收集docker日志
  12. .condarc(conda 配置文件)、换国内源
  13. explorer.exe应用程序错误,该内存不能为READ
  14. ES6新特性总结 一
  15. vs2019中git提交代码的步骤
  16. HDU-4747 Mex
  17. 有些打不开的国外网页
  18. 情侣的网站代码java_GitHub - 90x64/lovers-website: 程序员的情侣网站 (programmer's website of lovers)...
  19. sina 股票接口 2022.1.21 更新
  20. 关于北洋壳的网友问题

热门文章

  1. data-role参数表:
  2. python在eclipse下中文乱码问题zz
  3. hession调用json解析异常 com.caucho.hessian.io.HessianProtocolException: expected integer at 0x74 java.util
  4. 计算机科学与技术班级口号八字,班级的八字口号
  5. 万能点位图软件_红色网格衣+很多漂亮的花边像素图,绣手帕花边的十字绣图...
  6. 微信小程序结合Java后端实现登录注册
  7. 原来js的parseInt函数还可以这样用
  8. 使用jdbc执行SQL实现登录查询2-避免SQL注入版
  9. java深度克隆大数据_Java - 深拷贝技巧
  10. 【Makefile由浅入深完全学习记录2】初识 makefile 的结构