image.png
    思路:
    1、数组中全部是正数或者是负数,找出数组中最大的三个数的乘积即可
    2、数组中既有正数,又有负数,那么是最大乘积的可能性是下面两种情况:
    最大的数第二大的数第三大的数
    最小的数第二最小的数最大的数

    1. public class MaxProduct {
    2. public static void main(String[] args) {
    3. System.out.println(sort(new int[]{1,2,3,4,5}));
    4. }
    5. private static int sort(int[] arr) {
    6. // 利用系统自带的排序方法,算法复杂度是O(nlogn)
    7. Arrays.sort(arr);
    8. int length = arr.length;
    9. if (length < 3) {
    10. return -1;
    11. }
    12. return Math.max(arr[0]*arr[1]*arr[length-1], arr[length-1]*arr[length-2]*arr[length-3]);
    13. }
    14. }
    public class MaxProduct {
        public static void main(String[] args) {
            System.out.println(getMaxMin(new int[]{1,2,3,4,5}));
        }
    
        private static int getMaxMin(int[] arr) {
            int length = arr.length;
            if (length < 3) {
                return -1;
            }
            // 定义两个最小数的变量,三个最大数的变量
            int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
            int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
            // 循环找出数组中最小的两个数和最大的三个数
            for (int i : arr) {
                if (i < min1) {
                    // 如果这个数小于最小的数,那么将最小数变量赋值给第二最小数变量,这个数赋值给最小数变量
                    min2 = min1;
                    min1 = i;
                } else if (i < min2) {
                    // 如果这个数小于第二最小的数,那么将这个数赋值给第二最小数变量
                    min2 = i;
                }
    
                if (i > max1) {
                    // 如果这个数大于最大的数,那么将第二大数赋值给第三大数变量,最大数赋值给第二大数变量,这个数赋值给最大数变量
                    max3 = max2;
                    max2 = max1;
                    max1 = i;
                } else if (i > max2) {
                    // 如果这个数大于第二大数,那么将第二大数赋值给第三大数变量,这个数赋值给第二大数变量
                    max3 = max2;
                    max2 = i;
                } else if (i > max3) {
                    // 如果这个数大于第三大数,那么将这个数赋值给第三大数变量
                    max3 = i;
                }
            }
            // 通过上面的一个循环就找出来了,最大的数,第二大的数,第三大的数,最小的数,第二最小的数
            return Math.max(min1*min2*max1, max1*max2*max3);
        }
      }