来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-of-two-elements-in-an-array
给一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)(nums[j]-1) 取得最大值。
请计算并返回该式的最大值。
输入
{1,4,5,2}
输出:12
解释:12=(4-1)(5-1)
输入:{1,5,5,3}
输出:16
16=(5-1)*(5-1)
方法一:用排序算法数组先排好序,然后将排好序的最后一个元素和倒数第二个元素分别减一相乘
此处用的是冒泡排序,时间复杂度为O(n^2)
代码如下
void Swap(int *a,int *b)//交换函数
{
int tmp=*a;
*a=*b;
*b=tmp;
}
int maxProduct(int* nums, int numsSize)
{
int i,j;
//冒泡排序
for(i=0;i<numsSize-1;i++)//趟数
{
for(j=0;j<numsSize-1-i;j++)//对数组元素进行比较
{
if(nums[j]>nums[j+1])
{
Swap(&nums[j],&nums[j+1]);
}
}
}
return (nums[numsSize-1]-1)*(nums[numsSize-2]-1);
}
第二种方法很简单,其时间复杂度为O(n).
代码如下:
void Swap(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
int maxProduct(int* nums, int numsSize)
{
int i=0,k=0;
int max1=nums[0];
for(i=1;i<numsSize;i++)
{
if(max1<nums[i])
{
Swap(&max1,&nums[i]);
}
}//此时最大值是下标为0的元素
int max2=nums[1];
for(k=2;k<numsSize;k++)
{
if(max2<nums[k])
{
Swap(&max2,&nums[k]);
}
}//除第一次求得最大值以外,第二个最大值是下标为1的元素
return (max1-1)*(max2-1);//返回要求的值
}