算法小知识-----8.26-----数组中两元素的最大乘积

115 阅读2分钟

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

周五啦~大家起飞,今天周五不工作

数组中两元素的最大乘积

该题出自力扣的1464题 —— 数组中两元素的最大乘积【简单题】

审题

给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。

  • 请你计算并返回该式的最大值。

image.png

  • 该题的题意并不困难,只是相对有点拗口,实质上就是给出一个整数数组,找出数组的最大值和第二值,按照原题的公式就是找出乘积最大,那么乘积与元素的大小是线性关系的,因此目的就是找出最大值和最小值

  • 因此可以衍生出两种解法

    • 排序后输出
      • 直接使用Arrays.sort方法,对数据进行排序,排序后输出后两位的乘积
    • 第二种就是维护数组的最大位和次大位
      • 先对数组的第一位和第二位进行大小比较并且对换位置
      • 在对数组从下标第三位进行遍历,维护第一和第二位的最大数据
      • 最后输出最大的第一和第二即可
  • 因为我们只需要得到数组中两个最大的元素,我们可以在从左到右遍历的过程中维护两个变量 a,ba,b 来表示遍历过程中的最大和次大元素,那么一次遍历就可以得到数组中两个最大的元素。

编码

class Solution {
    public int maxProduct(int[] nums) {
        Arrays.sort(nums);
        int len = nums.length -1;
        return (nums[len] -1) * (nums[len -1] -1);
    }
}

image.png

class Solution {
    public int maxProduct(int[] nums) {
        int a = nums[0], b = nums[1];
        if (a < b) {
            int temp = a;
            a = b;
            b = temp;
        }
        for (int i = 2; i < nums.length; i++) {
            if (nums[i] > a) {
                b = a;
                a = nums[i];
            } else if (nums[i] > b) {
                b = nums[i];
            }
        }
        return (a - 1) * (b - 1);
    }
}

image.png