題目描述
給定一個無序數組,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度:O(n),空間複雜度:O(1)
輸入描述:
無序整數數組A[n]
輸出描述:
滿足條件的最大乘積
輸入:
4
3 4 1 2
輸出:
24
針對這道題,有兩種思路。
思路一:
- 直接對接收的數據,存入數組進行降序排序。
- 計算前三個數的乘積
- 後面兩個數乘積,再乘數組第一個數的乘積,後面兩個數乘積,再乘數組第一個數的乘積
- 讓 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));
}
}
思路二:
- 先定義3個最大的數的變量,和2個最小的數的變量。
- 每次接收一個數,進行比較。
- 最終只需要三個最大的數的乘積和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));
}
}在這裏插入代碼片