给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大
程序员文章站
2024-03-15 22:34:42
...
自己以前的思路是暴力**,时间复杂度太高,但是我觉得记录下来曾经写过的代码有多烂,也是一种进步...
1.解题思路:初始一个max值,用3层循环遍历数组将相乘的结果和max比较,最后得到最大值
package niuke;
import java.util.Scanner;
public class test28 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String s1=in.nextLine();
String[] c=s1.split(" ");
int[] arr=new int[c.length];
for(int i=0;i<c.length;i++) {
String str=c[i];
arr[i]=Integer.parseInt(str);
}
int max=arr[0]*arr[1]*arr[2];
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr.length;j++) {
for(int k=0;k<arr.length;k++) {
if(arr[i]*arr[j]*arr[k]>max&&(i!=j)&&(i!=k)&&(j!=k)) {
max=arr[i]*arr[j]*arr[k];
}
}
}
}
System.out.println(max);
}
}
2.解题思路:找数组中3个数的最大乘积(两种情况:第一种情况是3个正数最大值相乘的结果,第2中情况是2个负数最小值乘以一个正数最大值得结果)
package niuke;
import java.util.Arrays;
import java.util.Scanner;
public class test29 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long[] array = new long[n];
for (int i = 0; i <n ; i++) {
array[i] = sc.nextLong();
}
largestMul(array,n);
}
public static void largestMul(long[] num, int length){
long max1=0,max2=0,max3=0, min1=0,min2=0;
//利用o(n)的时间复杂度找3个最大值和2个最小值
for (int i = 0; i <length ; i++) {
if(num[i]!=0){
if(num[i]>max1){//max1是最大值,max2是次大值,max3是次次大值;如果有元素比最大值大,则所有的值全部更改
max3 = max2;
max2 = max1;
max1 = num[i];
}else if(num[i]>max2){//如果有元素比次大值大,但是比最大值小;即更改次大值和次次大值
max3 = max2;
max2 = num[i];
}else if(num[i]>max3){//如果有元素比次次大值大,但是比最大值和次大值都小的话,只更改次次大值
max3 = num[i];
}else if(num[i]<min1 ){//方法同上,找到两个最小值
min2 = min1;
min1 = num[i];
}else if(num[i]>min1 && num[i]<min2){
min2 = num[i];
}
}
}
如出现问题,请你及时指出,共同进步,谢谢!
推荐阅读
-
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大
-
JAVA 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
-
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
-
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大
-
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大
-
基础算法:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)