Skip to content

553. 最优除法

解题过程

INFO

题目链接 给定一正整数数组 nums,nums 中的相邻整数将进行浮点除法。例如,[2,3,4] -> 2 / 3 / 4 。 例如,nums = [2,3,4],我们将求表达式的值"2/3/4"。 但是,你可以在任意位置添加任意数目的括号,来改变算数的优先级。你需要找出怎么添加括号,以便计算后的表达式的值为最大值。 以字符串格式返回具有最大值的对应表达式。 注意:你的表达式不应该包含多余的括号

javascript

/**
 * @link https://leetcode.cn/problems/optimal-division/
 * @title 553. 最优除法
 * @description 给定一正整数数组 nums,nums 中的相邻整数将进行浮点除法。例如, [2,3,4] -> 2 / 3 / 4 。
例如,nums = [2,3,4],我们将求表达式的值 "2/3/4"。
但是,你可以在任意位置添加任意数目的括号,来改变算数的优先级。你需要找出怎么添加括号,以便计算后的表达式的值为最大值。
以字符串格式返回具有最大值的对应表达式。
注意:你的表达式不应该包含多余的括号
 * @param {number[]} nums
 * @return {string}
 */
// 解法一
// 思路:直接将数组第一项作为被除数,其余项作为除数即可,简单明了
var optimalDivision = function (nums) {
  if (nums.length <= 2) {
    return nums.join('/')
  }

  const [divided, ...divisors] = nums
  return divided + '/(' + divisors.join('/') + ')'
}

// 解法二
// 思路:优化解法一代码
var optimalDivision = function (nums) {
  const newNumStr = nums.join('/')
  const index = newNumStr.indexOf('/')
  return nums.length > 2 ? newNumStr.slice(0, index) + '/(' + newNumStr.slice(index + 1) + ')' : newNumStr
}

// const result = optimalDivision([1000,100,10,2]) // 1000/(100/10/2)
const result = optimalDivision([2, 3, 4]) // 2/(3/4)
// const result = optimalDivision([3, 2]) // 3/2
// const result = optimalDivision([2]) // 2
console.log(result)

解题感受

一开始以为,值最大,不就是除数最小,然后第二项到最后一项括号起来就好了,但考虑到这是中等一题,不会这么简单吧,从第二项到最后一项会不会还要添加什么判断之类的,尝试做了,竟然成功了。看了评论区也啥都不用很复杂的逻辑,就这么简单,脑筋急转弯题目确实。看了官方题解动态规划确实太复杂了,估计写完这些代码都要一两个小时来做没必要

优质题解