▶ 给出四个整数,求他们是否能加减乘除括号拼凑成 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. 获取iframe(angular 动态页面)高度

    问题比较特殊,google了好久才得到启示 开发的angular页面,需要嵌入到客户的web页中,以iframe方式.由于iframe的高度需要指定,而angular动态生成机制导致页面高度会随时变化 ...

  2. 数据库使用B+树原理

    转载:http://zhuanlan.51cto.com/art/201808/582078.htm https://www.cnblogs.com/vincently/p/4526560.html( ...

  3. jacoco生成覆盖率

    要统计自动化的覆盖率,所以临时看了下jacoco,记录下过程.后续用的时候方便查看. 1.build.gradle中修改 apply plugin: 'jacoco' android { buildT ...

  4. 创建Vue.js对象:我的第一个Vue.js输出信息

    <!DOCTYPE html><html><head><meta charset=”utf-8″><title>Vue第一条信息</t ...

  5. 20155323 2016-2017-2 《Java程序设计》第8周学习总结

    20155323 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 日志API:使用日志的起点是Logger类,要取得Logger类,必须使用Logger的静态 ...

  6. 【java基础】java关键字final

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  7. test20181029 数列

    题意 分析 考场做法 打表发现,最后的循环节一定是\(\gcd(a_1,a_2),\gcd(a_1,a_2),0\)这种形式,而稍微思考一下便知道这显然是一般情况. 然后都有gcd了,发现操作的实质都 ...

  8. koa/koa2项目搭建

    一键生成koa/koa2项目: 1. npm install -g koa-generator 2.新建项目目录 koa mytest (koa1项目) koa2 koa2test (koa2项目) ...

  9. hasura graphql auth-webhook api 说明

    hasura graphql 生产的使用是推荐使用webhook 进行角色访问控制的,官方同时提供了一个nodejs 的简单demo 代码 git clone https://github.com/h ...

  10. Mysql 批量插入数据的方法

    使用的方式是 MySqlBulkLoader 方法如下: 1. 转化datatable 为文件 2. 使用MySqlBulkLoader 进行数据的加载 代码: public static void ...