從陣列中找出乘積最大的三個數
阿新 • • 發佈:2019-01-10
題目:
給定一個無序陣列,包含正數、負數和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; }