数组中两元素的最大乘积

110 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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)
};