▶ 给出四个整数,求他们是否能加减乘除括号拼凑成 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. mysql 常见数据类型

    ---恢复内容开始--- MySQL常见的数据类型 一.数据类型是什么? 数据类型是指列.存储过程参数.表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型. 有一些数据是要存储为 ...

  2. uva10944 状态压缩bfs or DP

    又是一道状压搜索,题解有的是状压DP做的目前不会日后补 写好了以后一直蜜汁WA,看别人代码把判断再次回到原点的语句写在了Q.pop()之后而不是for里,对我也是一种启发吧这样写确实有好处比如起点就是 ...

  3. mysql alter修改字段的长度 类型sql语句

    在mysql中alter命令可以修改字段类型,长度,名称或一些其它的参数,下面我来给大家介绍alter函数修改字段长度与类型的两个命令,希望文章来给各位带来帮助.     mysql 修改字段长度 a ...

  4. 活字格企业Web应用生成器荣获"2017年度优秀软件产品"

    日前,中国软件行业协会权威发布"2017年度优秀软件产品"名单,活字格企业 Web 应用生成器凭借产品的独特优势,和近年来在企业Web应用方面的杰出贡献,位列其中,受到用户和行业专 ...

  5. 简单CSS3代码实现立方体以及3D骰子

    1 实现3D立方体 首先准备好UL以及6个Li: 代码如下 ul { position: absolute; top: 50%; left: 50%; transform:translate(-50% ...

  6. Github使用.gitignore文件忽略不必要上传的文件 (转)

    原文地址: https://blog.csdn.net/gjy211/article/details/51607347 常用编程语言及各种框架平台下的通用   .gitignore   文件 http ...

  7. 揭密FutureTask

    Future是我们在使用java实现异步时最常用到的一个类,我们可以向线程池提交一个Callable,并通过future对象获取执行结果.本篇文章主要讲述了JUC中FutureTask中的一些实现原理 ...

  8. springboot将项目打成war包

    1. 将项目的打包方式改为war包 <groupId>com.cc</groupId> <artifactId>aaaaaa</artifactId> ...

  9. WPF 多线程 UI:设计一个异步加载 UI 的容器

    对于 WPF 程序,如果你有某一个 UI 控件非常复杂,很有可能会卡住主 UI,给用户软件很卡的感受.但如果此时能有一个加载动画,那么就不会感受到那么卡顿了.UI 的卡住不同于 IO 操作或者密集的 ...

  10. HDU 3973 AC's String 字符串哈希

    HDU 3973 通过哈希函数将一个字符串转化为一个整数,通过特定的方式可以使得这个哈希值几乎没有冲突(这就是关键之处,几乎没有视为没有= =!, 其实也可以考虑实现哈希冲突时的处理,只是这道题没必要 ...