【LeetCode每日一题】1464.数组中两元素的最大乘积

125 阅读1分钟

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

【LeetCode每日一题】1464.数组中两元素的最大乘积

题目链接:leetcode.cn/problems/fi…

题目难度:中等

题意

给你一个整数数组 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)O(n^2)

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int ans=0,n=nums.size();
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                ans=max(ans,(nums[i]-1)*(nums[j]-1));
            }
        }
        return ans;
    }
};

题解二:排序

暴力当然太那啥了,思考降低时间复杂度,非常简单的方式是:排序。由于题目需要找数组中的最大值和次大值,于是直接排序找出即可。

时间复杂度:O(nlogn)O(nlogn)

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n=nums.size();
        return (nums[n-1]-1)*(nums[n-2]-1);
    }
};

题解三:一次遍历找最大值和次大值。

用两变量记录最大值和次大值,然后一次遍历找出即可。

时间复杂度:O(n)O(n)

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n=nums.size();
        int max_num1=nums[0],max_num2=nums[1];
        if(max_num1<max_num2) swap(max_num1,max_num2);
        for(int i=2;i<n;i++){
            if(max_num1<nums[i]){
                max_num2=max_num1;
                max_num1=nums[i];
            }else if(max_num2<nums[i]){
                max_num2=nums[i];
            }
        }
        return (max_num1-1)*(max_num2-1);
    }
};