一、题目描述
给定一组正整数,相邻整数之间会默认放置除号。
你可以在表达式中任意位置添加括号,改变运算优先级,使得整个表达式的结果最大。
要求:返回添加最优括号后的字符串表达式。
示例:
-
nums = [100,2,3,4] -
默认:
100/2/3/4 -
最优:
100/(2/3/4)结果最大
二、核心数学结论
全部是正整数,有一个万能贪心结论:
想要表达式结果最大:只需要让「分母尽可能小」
对于数组 a/b/c/d/e...
最大值一定是:a / (b/c/d/e...)
原因:
-
后面所有数连续相除,会让分母变得极小
-
被除数固定第一个数,分母越小,整体值越大
-
不需要任何动态规划、暴力枚举
cpp
class Solution {
public:
string optimalDivision(vector<int>& nums) {
int n = nums.size();
// if(n==2)
// return
if (n == 1)
return to_string(nums[0]);
string ret;
if (n == 2) {
ret += to_string(nums[0]) + '/' + to_string(nums[1]) ;
return ret;
}
int i = 0;
for (auto e : nums) {
i++;
ret += to_string(e);
if (i != n)
ret += '/';
if (i == 1)
ret += '(';
}
ret += ')';
return ret;
}
};