数组中两元素的最大乘积
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1)
取得最大值。
请你计算并返回该式的最大值。
示例 1:
输入:nums = [3,4,5,2]
输出:12
解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)(nums[2]-1) = (4-1)(5-1) = 3*4 = 12 。
示例 2:
输入:nums = [1,5,4,5]
输出:16
解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。
示例 3:
输入:nums = [3,7]
输出:12
解题思路
看到这个题目第一眼想到的就是利用双层循环遍历数组,获取他们的乘积,然后进行比较获取最大的值
再看第二眼就明白了:面积最大不就是最大的两个数的乘积嘛,只要将数组nums
进行排序,取到最大的两个数那么最大面积不就出来了嘛
具体步骤:
- 第一步:进行排序,不可能在写一个排序算法吧,可以利用
sort
方法,进行快速排序,我准备把最大值排在最前面,使用降序 - 第二步:此时前两个值是最大的,只需要返回 ``
var maxProduct = function(nums) { nums.sort((a, b) => b-a); return (nums[0] - 1) * (nums[1] - 1); };
知识点
sort()
方法对数组的项目进行排序。
默认情况下,sort()
方法将按字母和升序将值作为字符串进行排序。
如果想按照其他规则进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
简单点就是:比较函数两个参数a和b,返回a-b 升序,返回b-a 降序
且原数组会发生改变