1. 程式人生 > >從陣列中找出乘積最大的三個數

從陣列中找出乘積最大的三個數

題目:

給定一個無序陣列,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度:O(n),空間複雜度:O(1) 
輸入描述:
無序整數陣列A[n]

輸出描述:
滿足條件的最大乘積

輸入例子1:
3 4 1 2

輸出例子1:
24

思路:

由於空間複雜度和時間複雜度的要求,肯定無法先排序,因為排序最好時為O(n).整數的值任意需要分情況討論

1.當陣列的最大值<=0或者是陣列的最小值>=0時,乘積最大就是陣列中TOP3的乘積;

2.除第一種情況外,就需要考慮陣列中的最大的3個數和最小的2個數,因為最大乘積肯定是在(2小+1大)或(3大)   中取得,因此比較兩種記過就可得到最大乘積。

因此分析的,通過遍歷陣列有限次就可以實現該演算法。最多需要遍歷3次陣列,額外空間最多為10個位元組。滿足演算法要求

程式碼

public static void  pinduoduo()
	{
		Scanner sc=new Scanner(System.in);
		int N=sc.nextInt();
		long a[]=new long[N];
		for(int i=0;i<N;i++)
			a[i]=sc.nextInt();
		System.out.println(multiple(a));
	}
	public static long multiple(long a[])
	{
		int max_index=0;//最大對應的下標
		int min_index=0;//最小值對應的下標
		for(int i=1;i<a.length;i++)
		{
			if(a[min_index]>a[i])
				min_index=i;
			else if(a[max_index]<a[i])
				max_index=i;
		}
		
		long result=1;
		if(a[max_index]<=0||a[min_index]>=0)
		{
			result=result*a[max_index];
			long temp1=Long.MIN_VALUE;//陣列的第二大值
			int index=-1;
			for(int i=0;i<a.length;i++)
			{
				if(i!=max_index&&a[i]>temp1)
					{
					temp1=a[i];
					index=i;
					}
			}
			result=result*temp1;
			temp1=Long.MIN_VALUE;//陣列的第三大值
			int index2=-1;
			for(int i=0;i<a.length;i++)
			{
				if(i!=max_index&&i!=index&&a[i]>temp1)
					{
					temp1=a[i];
					index2=i;
					}
			}
			result=result*temp1;
			return result;
		}
		else if(a[max_index]>0&&a[min_index]<0)
		{
			long tempmin_2=Long.MAX_VALUE,index_min2=-1;//陣列的第二小值對應的值和下標
			long tempmax_2=Long.MIN_VALUE,index_max2=-1;//陣列的第二大值對應的值和下標
			long tempmax_3=Long.MIN_VALUE,index_max3=-1;//陣列的第三大值對應的值和下標
			for(int i=0;i<a.length;i++)
			{
				if(i!=min_index&&a[i]<tempmin_2)
					{
					tempmin_2=a[i];
					index_min2=i;
					}
				if(i!=max_index&&a[i]>tempmax_2)
				{
					tempmax_2=a[i];
					index_max2=i;
				}
			}
			for(int i=0;i<a.length;i++)
			{
				if(i!=max_index&&i!=index_max2&&a[i]>tempmax_3)
				{
					tempmax_3=a[i];
					index_max3=i;
				}
			}
			long result1=a[min_index]*tempmin_2*a[max_index];
			long result2=a[max_index]*tempmax_2*tempmax_3;
			return result1>result2?result1:result2;
		}
		return 0;
	}