LeetCode数组中两元素的最大乘积使用JavaScript解题|前端学算法

1,149 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

有人相爱,有人夜里开车看海,我是leetcode第一题都做不出来

这是LeetCode的第1464题:数组中两元素的最大乘积

数组中两元素的最大乘积

给你一个整数数组 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);
};

image.png

知识点

  • sort() 方法对数组的项目进行排序。

默认情况下,sort() 方法将按字母和升序将值作为字符串进行排序。

如果想按照其他规则进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b

若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
简单点就是:比较函数两个参数a和b,返回a-b 升序,返回b-a 降序

且原数组会发生改变