最大乘積

題目描述
給定一個無序數組,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度:O(n),空間複雜度:O(1)
輸入描述:
無序整數數組A[n]
輸出描述:
滿足條件的最大乘積
輸入:
4
3 4 1 2
輸出:
24
針對這道題,有兩種思路。
思路一:

  1. 直接對接收的數據,存入數組進行降序排序。
  2. 計算前三個數的乘積
  3. 後面兩個數乘積,再乘數組第一個數的乘積,後面兩個數乘積,再乘數組第一個數的乘積
  4. 讓 2 和 3的結果進行比較,輸出較大的。
    運算時間:360ms左右

代碼實現:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) { 
		Scanner sca = new Scanner(System.in);
		int N = sca.nextInt();
		int [] data = new int [N];
		for(int i = 0; i < N; i++) {
			data[i] = sca.nextInt();
		}
		int temp;
		long productOne = 0;
		long productTwo = 0;
		for(int i = 0; i < N; i++) {
			for(int j = i + 1; j < N; j++) {
				if(data[i] < data[j]) {
					temp    = data[i];
					data[i] = data[j];
					data[j] = temp;
				}
			}
		}
		productOne = (long)data[0] * data[1] * data[2];
		productTwo = (long)data[0] * data[N - 1] * data[N - 2];
		System.out.println(Math.max(productOne, productTwo));
	}
}

思路二:

  1. 先定義3個最大的數的變量,和2個最小的數的變量。
  2. 每次接收一個數,進行比較。
  3. 最終只需要三個最大的數的乘積和2個最小的數和最大的一個數的乘積,進行比較即可。
    運算時間:視情況而定。因爲牽扯到調或者不調java庫函數。

代碼實現:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		 Scanner sca = new Scanner(System.in);
		 int num, max = 0, maxOne = 0, maxTwo = 0, min = 0, minOne = 0;
		 int N = sca.nextInt();
		 for(int i = 0; i < N; i++) {
			 num = sca.nextInt();
			 if(max > num) {
				 maxTwo = Math.max(Math.min(maxOne, num), maxTwo);
				 maxOne = Math.max(maxOne, num);
			 }else {
				 maxTwo = maxOne;
				 maxOne = max;
				 max    = num;
			 }
			 if(min < num) {
				 minOne = Math.min(minOne, num); 
			 }else {
				 minOne = min;
				 min    = num;
			 }
		 }
		 long productOne = (long)max * maxOne * maxTwo;
		 long productTwo = (long)max * minOne * min;
		 System.out.println(Math.max(productOne, productTwo));
	}
}在這裏插入代碼片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章