题目
给定一个长度为4的整数数组 cards
。你有 4
张卡片,每张卡片上都包含一个范围在 [1,9]
的数字。您应该使用运算符 ['+', '-', '*', '/']
和括号 '('
和 ')'
将这些卡片上的数字排列成数学表达式,以获得值24
。
你须遵守以下规则:
- 除法运算符
'/'
表示实数除法,而不是整数除法。- 例如,
4 /(1 - 2 / 3)= 4 /(1 / 3)= 12
。
- 例如,
- 每个运算都在两个数字之间。特别是,不能使用
“-”
作为一元运算符。- 例如,如果
cards =[1,1,1,1]
,则表达式“-1 -1 -1 -1”
是 不允许 的。
- 例如,如果
- 你不能把数字串在一起
- 例如,如果
cards =[1,2,1,2]
,则表达式“12 + 12”
无效。
- 例如,如果
- 如果可以得到这样的表达式,其计算结果为
24
,则返回true
,否则返回false
。
示例 1:
输入: cards = [4, 1, 8, 7]
输出: true
解释: (8-4) * (7-1) = 24
示例 2:
输入: cards = [1, 2, 1, 2]
输出: false
提示:
cards.length == 4
-
解题方法
递归回溯
每次完成两个元素的所有运算,减少数组中元素个数直至只剩一个数,再与
24
比较后返回结果。class Solution { public: bool solve(vector<double>& nums) { if (nums.size() == 1) { if (abs(nums[0] - 24) < 1e-6) return true; else return false; } int n = nums.size(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i != j) { vector<double> newnums; for (int k = 0; k < n; k++) { if (k != i && k != j) newnums.push_back(nums[k]); } for (int k = 0; k < 4; k++) { if (k<2 && i>j) continue; if (k == 0) newnums.push_back(nums[i] + nums[j]); if (k == 1) newnums.push_back(nums[i] * nums[j]); if (k == 2) newnums.push_back(nums[i] - nums[j]); if (k == 3) { if (nums[j] < 1e-6) continue; else newnums.push_back(nums[i] / nums[j]); } if (solve(newnums)) return true; newnums.pop_back(); } vector<double>().swap(newnums); } } } return false; } bool judgePoint24(vector<int>& cards) { vector<double> newnums; int n = cards.size(); for (int i = 0; i < n; i++) { newnums.push_back(cards[i]); } return solve(newnums); } };