携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
描述
给你一个整数数组nums,找出数组的两个不同下标i和j,使得(nums[i] - 1) * (nums[j] - 1)取得最大值。
例如:
给出数组:[3,5,8,12,6]
返回结果就是77,下标i、j分别是2和3,对应的值是8和12,那(8 - 1) * (12 - 1)就等于77
提示:
2 <= nums.length <= 500
1 <= nums[i] <= 10^3
分析
取下标i和j对应的值分别减一的乘积最大值,其实也就是求两下标对应值的最大值乘积。
数组长度最小是2,当数组长度是2的时候,我们直接计算返回结果。
首先有人可能会想到用遍历,先取初始两个值,在往后不断遍历的过程中,对比当前值与目标数组中两个值的大小,如果大于其中一个,则替换较小者重新组成,如此循环,知道找到最大的两个数,然后进行运算返回结果。
这样是否能解题,肯定可以,但操作有点复杂。
还有一种更简单的方法,那就是先对数组排序,如果是升序,那直接取数组的最后两个元素分别减一的乘积;如果是降序,那就取数组的前两个元素再运算。思路和代码的很简单。
排序
在JavaScript中数组的排序sort方法,默认排序是将数组元素转换成字符串,然后比较它们的UTF-16格式代码单元值序列。所以本题数字排序不能直接执行sort(),还需要在sort方法添加一个compare方法参数来对数组相邻元素进行比较排序。
程序实现
根据以上分析,具体代码实现如下:
var maxProduct = function(nums) {
// 数组最小长度2,如果长度正好是2,则直接返回减一乘积
if (nums.length === 2) return (nums[0] - 1) * (nums[1] - 1)
// 先排序
const arr = nums.sort((a,b) => {return a - b})
return (arr[nums.length - 1] - 1) * (arr[nums.length - 2] - 1)
};