leetcode刷题记录-1464. 数组中两元素的最大乘积

83 阅读1分钟

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

前言

今天的题目为简单,解题的方式很多,但是主要的关键点都是一样的,做题把握好题目的根本,能够比较容易的对题目做出解答

每日一题

今天的题目是 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

 

提示:

  • 2 <= nums.length <= 500
  • 1 <= nums[i] <= 10^3

题解

暴力解法

题目要求要找到乘积最大的两个元素,最简单的解决方法就是循环两次数组,将不同的下标的每一个数都进行相乘,最后得到一个最大的乘积。

当然,这也是比较不推荐的解法,时间复杂度为 O(n2),耗时比较久。

function maxProduct(nums: number[]): number {
    let max = 0;
    let n = nums.length
    for(let i=0;i<n;i++) {
        for(let j=0;j<n;j++) {
            if(i!=j)
            max = Math.max(max, ((nums[i]-1)*(nums[j]-1)))
        }
    }
    return max
};

image.png

排序

题目的要求其实理解本质就是要去找到数组中最大的和次大的两个元素,那么我们可以先把数组进行排序,排序过后的数组第一位和第二位

function maxProduct(nums: number[]): number {
    nums.sort((a, b) => b - a);
    return (nums[0]-1) * (nums[1] - 1);
};

image.png

维护最大值和次大值,一次循环

既然需要数组中的最大值和次大值,我们可以循环一遍数组,对这两个值进行维护,维护得到的值在进行相乘得到乘积。

function maxProduct(nums: number[]): number {
    let max1 = 0;
    let max2 = 0;
    nums.forEach(e=>{
        if(e>max1){
            max2=max1
            max1=e
        }else if(e>max2){
            max2 = e
        }
    })
    return (max1-1)*(max2-1)
};

image.png