传送门

Description

You have 4 cards each containing a number from 1 to 9. You need to judge whether they could operated through *, /, +, -, (, )to get the value of 24.

Example 1:
Input: [4, 1, 8, 7]
Output: True
Explanation: (8-4) * (7-1) = 24
Example 2:
Input: [1, 2, 1, 2]
Output: False

Note:

  1. The division operator / represents real division, not integer division. For example, 4 / (1 - 2/3) = 12.
  2. Every operation done is between two numbers. In particular, we cannot use - as a unary operator. For example, with [1, 1, 1, 1] as input, the expression -1 -1 -1 -1 is not allowed.
  3. You cannot concatenate numbers together. For example, if the input is [1, 2, 1, 2],  we cannot write this as 12 + 12.

思路

题意:给定四张标有数字(1-9)的卡片,问通过加减乘除和小括号组成的表达式的结果能否等于24。

题解:考虑穷举法的话,四个数字共有4!种排列方法,4个数字中间加入符号共有4x4x4种方法,最后考虑小括号,小括号的放法共有(A(B(CD))、(A((BC)D)、((AB)(CD))、((A(BC))D)、(((AB)C)D)五种,那么种类最多有4!x4^3x5 = 7680种。

考虑回溯法,首先我们从集合A = {1 、2、3、4}中任意取出两个数,如取1、2,那么A = A - {1、2},对取出来的两个数字分别进行不同的四则运算,1 + 2、1 - 2……,将结果加入A中,有{3、3、4}、{-1,3,4}等,通过这种方法,将四个数降为三个数,然后降为两个数……

Java

class Solution {boolean res = false;final double esp = 1e-4;public boolean judgePoint24(int[] nums) {List<Double>list = new ArrayList<Double>();for (int val:nums)  list.add((double)val);solver(list);return res;}void solver(List<Double> array){if (res)    return;if (array.size() == 1 && Math.abs(array.get(0) - 24.0) <= esp){res = true;return;}for (int i = 0;i < array.size();i++){for (int j = 0;j < i;j++){List<Double>list = new ArrayList<Double>();Double p1 = array.get(i),p2 = array.get(j);list.addAll(Arrays.asList(p1+p2,p1-p2,p2-p1,p1*p2));//除数是否为0if (Math.abs(p1) > esp){list.add(p2/p1);}if (Math.abs(p2) > esp){list.add(p1/p2);}array.remove(i);array.remove(j);for (Double val:list){array.add(val);solver(array);array.remove(val);}array.add(j,p2);array.add(i,p1);}}}
}

  

转载于:https://www.cnblogs.com/ZhaoxiCheung/p/7545957.html

[LeetCode] 679. 24 Game(回溯法)相关推荐

  1. 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全

    从LeetCode 679. 24 Game–C++ 解法–二十四点 到穷举24点所有可能性 此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题 ...

  2. LeetCode之单词搜索(回溯法求解)

    题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元格内 ...

  3. LeetCode 47 全排列 II -- 回溯法

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations-ii 题意: 给定一个可包含重复数字的序列 nums ,按任意顺序 返 ...

  4. Leetcode 679. 24 点游戏 (暴力)

    题目链接:679. 24 点游戏 这个题一开始,估摸估摸着数据量,感觉应该能用暴力暴力出来,只可惜自己写的暴力有问题,自己一开始的思想是,将4个数分为两两一组组,每组做加减乘除运算-很天真对吧现在看起 ...

  5. LeetCode 679. 24 点游戏(回溯)

    文章目录 1. 题目 2. 解题 1. 题目 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输 ...

  6. 【LeetCode】46 全排列 回溯法三部曲模板+树枝节点去重

    因为确定leecode测试用例:-10 <= nums[i] <= 10,所以使用固定数组来代替unordered_set<> 进行树枝节点去重操作,减少一定的开销,同时相对来 ...

  7. LeetCode Restore IP Addresses(回溯法)

    题意:给出一个由数字组成的字符串,求其能表示的ip地址列表 注意不能有前缀0,如010 思路:每次操作时,有两种情况,一种是添加点,一种是将其作为当前数的后序数. 在小数点的个数超过3时,递归退出. ...

  8. LeetCode算法总结-回溯法与深度优先搜索

    转载自  LeetCode算法总结-回溯法与深度优先搜索 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退 ...

  9. LeetCode Gray Code(回溯法)

    问题:gray code是一种二进制数字系统,两个连续的数只有一位不同.给出一个正整数n,n表示gray code的位数,输出gray code. 思路:使用回溯法.通过枚举0,1,2,3的gray ...

最新文章

  1. Socket 共用一个port的问题
  2. Python 动态载入模块
  3. Winform中FormClosing与FormClosed区别与使用
  4. 幼儿课外活动游戏_泰国清迈大小学校介绍 --【Little Star小星星幼儿园】
  5. 研华自动驾驶计算机,ADVANTECH研华TPC-1582H-433BE 工业平板电脑一体机计算机工控机...
  6. Table of Contents
  7. SolrJ 查询数据
  8. 关于UIColor这个类的一些不知道的事
  9. npp 插件html,Notepad++中常用的插件
  10. 区块链技术之P2P网络(一)
  11. vmsysjack-tupian
  12. 隐秘的度假地_如何避免花太多钱去度假
  13. Easy Algorithms系列——详解递归与分治
  14. 艾司博讯:拼多多全店推广是什么意思?
  15. golang —— go语言科学记数法使用
  16. Go语言Web项目搭建
  17. 如何下载并安装Python
  18. 联合概率数据互联(JPDA) ----多假设跟踪(MHT)
  19. 计算机应用4班班委决定,大学毕业游策划书
  20. 使用OpenSSL_EVP接口完成SHA3和国密SM3散列生成

热门文章

  1. 算法导论第10章习题
  2. Pro Silverlight 5 in C# 分享
  3. DWR2学习笔记(一)
  4. [转自李战博客]悟透JavaScript
  5. 我的LAMP实现过程——apache+php
  6. Springboot04整合Druid
  7. Android-多击事件处理
  8. 窗口限制文件上传格式
  9. hdu 4560 拆点最大流 ***
  10. 某外企招聘程序员部分面试题,求作答!!!