算法初探LeetCode-最优除法

52 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 <= 10
  • 2 <= 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();
    }
}

结果详情

Snipaste_2023-02-26_22-12-07.png

算法复杂度

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)一起进步,一起成长!