679. 24 Game
▶ 给出四个整数,求他们是否能加减乘除括号拼凑成 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的更多相关文章
- Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game)
Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game) 深度优先搜索的解题详细介绍,点击 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+, ...
- Java实现 LeetCode 679 24 点游戏(递归)
679. 24 点游戏 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: ...
- [LeetCode] 679. 24 Game(回溯法)
传送门 Description You have 4 cards each containing a number from 1 to 9. You need to judge whether the ...
- Leetcode 679.24点游戏
24点游戏 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: (8-4) ...
- [leetcode] 679. 24 Game (Hard)
24点游戏,游戏规则就是利用().+.-. *. /,对四个数字任意运算,可以得出24点则为true. 排列组合问题,最多有A42*A32*A22*4*4*4,也就是12*6*2*4*4=9216种组 ...
- 【leetcode】679. 24 Game
题目如下: 解题思路:24点是非常经典的游戏了,因为本题数据量小,可以使用穷举法,把所有的可能结果都算出来.假设nums = [a,b,c,d],记f(n)表示用nums中n个数字进行运算可以得到的结 ...
- 每日一题 LeetCode 679. 24点游戏 【递归】【全排列】
题目链接 https://leetcode-cn.com/problems/24-game/ 题目说明 题解 主要方法:递归 + 全排列 解释说明: 将 4 个数进行组合形成算式,发现除了 (a❈b) ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
随机推荐
- 递归--练习4--noi666放苹果
递归--练习4--noi666放苹果 一.心得 写出状态后勇敢假设 二.题目 666:放苹果 总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允 ...
- MySQL查询in操作排序
in操作排序 先说解决方案: select * from test where id in(3,1,5) order by field(id,3,1,5); 或许有人会注意过,但我以前真不知道 SQL ...
- 如何高效利用 GitHub
正是 Github,让社会化编程成为现实.本文尝试谈谈 GitHub 的文化.技巧与影响. Q1:GitHub 是什么 Q2:GitHub 风格 Q3: 在 GitHub,如何跟牛人学习 Q4: 享受 ...
- UVA-11248 Frequency Hopping (最大流+最小割)
题目大意:给一张网络,问是否存在一条恰为C的流.若不存在,那是否存在一条弧,使得改动这条弧的容量后能恰有为C的流? 题目分析:先找出最大流,如果最大流不比C小,那么一定存在一条恰为C的流.否则,找出最 ...
- 如果从excel表中导出insert-sql
=CONCATENATE("INSERT INTO p_act_lottery(actId,status,grantWay,createTime,invalidTime,amount,pri ...
- Linux vi编辑器的使用
vi是Visual Interface的简称,它是Linux/Unix下的文本编辑器,例如你想编辑文件english.txt,则你可以在终端下输入 vi english.txt命令,然后就进入了编辑界 ...
- 旋转木马幻灯片切换效果JS源码详解
首先,放上慕课网的课程链接,源码是在这个课程里分享出来的,https://www.imooc.com/learn/386. 文章适合学习过这个课程的同学,再看这篇文章,可能有更深入的理解.主要是对各种 ...
- maven编译报错 -source 1.5 中不支持 lambda 表达式(转)
原文链接:http://blog.csdn.net/kai161/article/details/50379418 在用maven编译项目是由于项目中用了jdk 1.8, 编译是报错 -source ...
- 64位的ubuntu14.04 LTS安装 Linux交叉编译工具链及32位“ia32-libs”依赖库
ubuntu又迎来了其新一代的长期支持版本 14.04 LTS,其带来了许多令人期待的新特新,遂决定进行升级. 装好了64位版本及安装 Linux交叉编译工具链 运行GCC,${CROSS_COMPI ...
- rabbitmq学习(三):rabbitmq之扇形交换机、主题交换机
前言 上篇我们学习了rabbitmq的作用以及直连交换机的代码实现,这篇我们继续看如何用代码实现扇形交换机和主题交换机 一.扇形交换机 1.生产者 /** * 生产者 */ public class ...