开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 23 天,点击查看活动详情
LeetCode553:最优除法
给定一正整数数组 ****nums , nums 中的相邻整数将进行浮点除法。例如, [2,3,4] -> 2 / 3 / 4 。
- 例如,
nums = [2,3,4],我们将求表达式的值"2/3/4"。
但是,你可以在任意位置添加任意数目的括号,来改变算数的优先级。你需要找出怎么添加括号,以便计算后的表达式的值为最大值。
以字符串格式返回具有最大值的对应表达式。
注意: 你的表达式不应该包含多余的括号。 示例 1:
输入: [1000,100,10,2]
输出: "1000/(100/10/2)"
解释: 1000/(100/10/2) = 1000/((100/10)/2) = 200
但是,以下加粗的括号 "1000/( ( 100/10 ) /2)" 是冗余的,
因为他们并不影响操作的优先级,所以你需要返回 "1000/(100/10/2)"。
其他用例:
1000/(100/10)/2 = 50
1000/(100/(10/2)) = 50
1000/100/10/2 = 0.5
1000/100/(10/2) = 2
示例 2:
输入: nums = [2,3,4]
输出: "2/(3/4)"
解释: (2/(3/4)) = 8/3 = 2.667
可以看出,在尝试了所有的可能性之后,我们无法得到一个结果大于 2.667 的表达式。
说明:
1 <= nums.length <= 102 <= nums[i] <= 1000- 对于给定的输入只有一种最优除法。
思路分析
根据题意因为是连除,所以第一个值已经是固定的分子了,其除的值越多就越小,此时就要想办法让分母最小即可。只要数大于2个,就证明要多除几个数,所以让分母互除即可。
要整体结果更大,可以转换成被除数更大,或者除数更小 由于整个过程中只能使用除法,而且元素都是正整数 所以只用第一个元素当整体的被除数是最大的
算法代码
class Solution {
public String optimalDivision(int[] nums) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nums.length; i++) {
sb.append(nums[i]);
if (i == 0 && nums.length > 2) {
sb.append("/(");
} else if (i == nums.length - 1) {
if (nums.length > 2) {
sb.append(")");
}
} else {
sb.append("/");
}
}
return sb.toString();
}
}
结果详情
算法复杂度
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN)一起进步,一起成长!