求数组中最大元素的乘积

来源:力扣(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);//返回要求的值
	
}

猜你喜欢

转载自blog.csdn.net/csdn_edition/article/details/106864525