携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
【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
提示:
2 <= nums.length <= 5001 <= nums[i] <= 10^3
题目比较简单,随便写三种解法吧...
题解一:暴力
暴力出奇迹,直接两重循环,遍历所有的整数对,找出符合题意最大的乘积即可。
时间复杂度:
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;
}
};
题解二:排序
暴力当然太那啥了,思考降低时间复杂度,非常简单的方式是:排序。由于题目需要找数组中的最大值和次大值,于是直接排序找出即可。
时间复杂度:
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);
}
};
题解三:一次遍历找最大值和次大值。
用两变量记录最大值和次大值,然后一次遍历找出即可。
时间复杂度:
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);
}
};