▶ 给出四个整数,求他们是否能加减乘除括号拼凑成 24

● 代码,11 ms,正向枚举,推广性很强(nums 可以改为任意长度,也不限于拼凑 24 这个和),缺点是只能判定是否有解,不方便输出不重复的解

 class Solution
{
public :
bool judgePoint24(vector<int>& nums)
{
vector<double> temp;
for (auto v : nums)
temp.push_back((double)v);
return solve(temp);
}
bool solve(vector<double> nums)
{
if (nums.size() == )
return false;
if (nums.size() == )
return abs(nums[] - ) < 1e-; int i, j, k;
vector<double> nums2;
for (i = ; i < nums.size(); i++)// i 和 j 抢占两个元素
{
for (j = ; j < nums.size(); j++)
{
if (i == j)
continue;
nums2.clear();
for (k = ; k < nums.size(); k++)// 把剩下两个元素放入 nums2 中
{
if (k != i && k != j)
nums2.push_back(nums[k]);
}
for (k = ; k < ; k++)// 尝试对 nums[i] 和 nums[j] 进行各种计算,结果放入 nums2 中
{
if (j > i && k < )// + 和 * 仅在 下标 j < i 的时候进行,这里 k 仅代表算符编号,不代表数组下标
continue;
if (k == )
nums2.push_back(nums[i] + nums[j]);
if (k == )
nums2.push_back(nums[i] * nums[j]);
if (k == )
nums2.push_back(nums[i] - nums[j]);
if (k == )
{
if (nums[j] != )
nums2.push_back(nums[i] / nums[j]);
else
continue;
}
if (solve(nums2))// 计算 nums2 中剩余项是否能凑 24
return true;
nums2.erase(nums2.end()-);// 不能凑 24,把本次尝试的 nums[i] 和 nums[j] 的计算结果抹掉
}
}
}
return false;
}
};

● 分情况讨论,3 ms,代码非常暴力,仅适用于4元情况,不过可以通过添加新的函数 valid() 来支持更多的元

 class Solution
{
public:
bool judgePoint24(vector<int>& nums)
{
sort(nums.begin(), nums.end());
if (valid(nums))
return true;
for(; next_permutation(nums.begin(), nums.end());)
{
if (valid(nums))
return true;
}
return false;
}
bool valid(vector<int>& nums)
{
const double a = nums[], b = nums[], c = nums[], d = nums[];
if (valid(a + b, c, d) || valid(a - b, c, d) || valid(a * b, c, d) || valid(a / b, c, d))
return true;
if (valid(a, b + c, d) || valid(a, b - c, d) || valid(a, b * c, d) || valid(a, b / c, d))
return true;
if (valid(a, b, c + d) || valid(a, b, c - d) || valid(a, b, c * d) || valid(a, b, c / d))
return true;
return false;
}
bool valid(double a, double b, double c)
{
if (valid(a + b, c) || valid(a - b, c) || valid(a * b, c) || b && valid(a / b, c))
return true;
if (valid(a, b + c) || valid(a, b - c) || valid(a, b * c) || c && valid(a, b / c))
return true;
return false;
}
bool valid(double a, double b)
{
if (abs(a + b - 24.0) < 0.0001 || abs(a - b - 24.0) < 0.0001 || abs(a * b - 24.0) < 0.0001 || b && abs(a / b - 24.0) < 0.0001)
return true;
return false;
}
};

● 收录一个 python 的神奇的方法,大意是所有 495 种计算组合中有 404 种可解,91种不可解。把这 91 种无解的情况的 4 个数字从小大排序为一个四位数,加上特定的偏移量(代码中的 42921 和 19968)后转化为 Unicode 的一个字符保存起来,每次判定的时候只要检查所给的四个数字按上述方法转化城的字符是否在表中即可,时间复杂度 O(1),方法不可扩展

 def judgePoint24(nums):
bad = '떢븻각걎냇갅갸꺚뵟숣욄뵴뵞뤼갈갌뤔떌옊메늄숭캸긶꺛옖갍뇐쩢곴듇걯궄옕왹눞솴걃끗긬땉궿가쌀낐걄숤뺴늘걘꽸숢걂갋갃쫐꼔솾쩡쇔솿끛뤜간븺쩬웨딴옠뤛갂뵪덠놤빐옋귒늂갰갖놥궾갆옌뼘묰거갎긷낤겼'
return chr(int(''.join(map(str, sorted(nums)))) + 42921) not in bad def judgePoint24(nums):
bad = '对撒剘劥圞剜劏哱掶桺泛揋掵従剟剣彫寣污悫壛梄甏咍哲汭剤堧点卋嬞勆叛汬泐塵栋劚嚮咃宠吖剗楗囧力桻攋壯劯嗏桹劙剢剚焧啫栕炸栫栖嚲彳剛撑烃洿宋汷彲剙揁妷埻撧汢吩壙劇剭埼吕剝汣敯憇勇剥咎囻匓'
return chr(int(''.join(map(str, sorted(nums)))) + 19968) not in bad

■ 实测有效:

  

679. 24 Game的更多相关文章

  1. Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game)

    Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game) 深度优先搜索的解题详细介绍,点击 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+, ...

  2. Java实现 LeetCode 679 24 点游戏(递归)

    679. 24 点游戏 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: ...

  3. [LeetCode] 679. 24 Game(回溯法)

    传送门 Description You have 4 cards each containing a number from 1 to 9. You need to judge whether the ...

  4. Leetcode 679.24点游戏

    24点游戏 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: (8-4) ...

  5. [leetcode] 679. 24 Game (Hard)

    24点游戏,游戏规则就是利用().+.-. *. /,对四个数字任意运算,可以得出24点则为true. 排列组合问题,最多有A42*A32*A22*4*4*4,也就是12*6*2*4*4=9216种组 ...

  6. 【leetcode】679. 24 Game

    题目如下: 解题思路:24点是非常经典的游戏了,因为本题数据量小,可以使用穷举法,把所有的可能结果都算出来.假设nums = [a,b,c,d],记f(n)表示用nums中n个数字进行运算可以得到的结 ...

  7. 每日一题 LeetCode 679. 24点游戏 【递归】【全排列】

    题目链接 https://leetcode-cn.com/problems/24-game/ 题目说明 题解 主要方法:递归 + 全排列 解释说明: 将 4 个数进行组合形成算式,发现除了 (a❈b) ...

  8. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  9. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

随机推荐

  1. 雷林鹏分享:Ruby 多线程

    Ruby 多线程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程. Ruby 中我们可以通 ...

  2. Filter实现session超时自动跳转到login页,超过试用期不许登录

    新建一个过滤器 package com.autumn.filter; import com.autumn.pojo.Users; import javax.servlet.*; import java ...

  3. Linux CentOS 6.5 使用自带jdk修改环境变量

    首先声明,默认jdk指我们安装完CentOS后系统自带jdk,自己下载安装的jdk只需要下载,解压即可,之后步骤与此文一致 1.查看我们默认jdk的位置 指令: which java 我们去看一下发现 ...

  4. 初识webservice 服务

    1.获取电话号码归属地查询 首先访问: http://www.webxml.com.cn/zh_cn/web_services.aspx ①新建一个MyEclipse项目(WebService) ht ...

  5. JavaScript学习总结(二十一)——使用JavaScript的数组实现数据结构中的队列与堆栈

    今天在项目中要使用JavaScript实现数据结构中的队列和堆栈,这里做一下总结. 一.队列和堆栈的简单介绍 1.1.队列的基本概念 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被 ...

  6. reg文件中文乱码

    用reg文件方式修改注册表很方便,但是如果字段中有中文的话,执行reg文件后,注册表中的中文出现乱码. 解决办法:将文件保存文Unicode编码方式即可.(保存文UTF8编码也是不行的) 附一个添加\ ...

  7. 联想A390T刷机ROOT教程

    一.联想A390T手动进入Recovery的方法: [步骤一]首先,将你的A390T手机关机,关机状态下,先按住电源键2秒,不要松开,再同时按下音量加.音量减两个键,此时,3个键一直按住不要放开,几秒 ...

  8. 流程设计器jQuery + svg/vml(Demo3 - 添加流程结点)

    经过前面的准备工作,终于把设计器的主要UI界面搭建好了,接下来到添加流程结点,效果如下图 代码:GoFlow_03.zip 演示地址:Demo 微信演示公众号: 另:Silverlight版 Silv ...

  9. mouseover、mouseout和mouseenter、mouseleave

    这里直接把<Javascript 高级程序设计(第三版)>中的解释贴出来: mouseover:在鼠标指针位于一个元素外部,然后用户将其首次移入另一个元素边界之内时触发.不能通过键盘触发这 ...

  10. 5.2离线使用xadmin包

    把xadmin包放到项目目录下,便于修改xadmin中的代码. 首先解压下载好的 xadmin-django2.zip 压缩包,拷贝子文件夹中的xadmin文件夹,到项目中新建extra_apps文件 ...