欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

给定一个无序数组,包含正数、负数和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];
                }
            }
        }

如出现问题,请你及时指出,共同进步,谢谢!