三个数的最大乘积(Java实现)

问题描述:

给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:

输入: [1,2,3]
输出: 6

示例 2:

输入: [1,2,3,4]
输出: 24

注意:

  1. 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
  2. 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。

解题思路:

  1. 先对给定数组进行排序,我采取降序排序。
  2. 此时分为以下几种情况:
    1. 排序后的第一个元素小于等于0,或者最后一个元素大于等0,此时三个乘积最大应该是前三个元素的乘积。
    2. 排序后的第二个元素小于等于0,或第三个个元素小于等于零,此时三个乘积最大应该是第一个和最后两个元素的乘积。
    3. 排序后的最后两个元素都为负数,并且乘积大于第二个和第三个元素的乘积,此时三个乘积最大应该是第一个和最后两个元素的乘积。
    4. 除了以上情况,其他情况的最大乘积均是排序后的前三个元素的乘积。

实现过程:

    public static int maximumProduct(int[] nums) {
        int n = nums.length;
        if (n < 3) {
            return 0;
        }else if (n == 3) {
            return (nums[0]*nums[1]*nums[2]);
        }else {
            shellSort(nums);
            if (nums[0] <= 0 || nums[n-1] >= 0) {
                return (nums[0]*nums[1]*nums[2]);
            }else if (nums[1] <= 0 || nums[2] <= 0) {
                return (nums[0]*nums[n-1]*nums[n-2]);
            }else {
                if (nums[n-1]*nums[n-2] > nums[1]*nums[2]) {
                    return (nums[0]*nums[n-1]*nums[n-2]);
                }else {
                    return (nums[0]*nums[1]*nums[2]);
                }
            }
        }
    }

    public static void shellSort(int[] arr) { //shell排序法
        int n = arr.length;
        if (n <= 1) {
            return;
        }
        for (int i = n/2; i >= 1; i /= 2) {
            for (int j = i; j < n; j++) {
                int value = arr[j];
                int k = j - i;
                while (k >= 0) {
                    if (value > arr[k]) {
                        arr[k+i] = arr[k];
                        k -= i;
                    }else {
                        break;
                    }
                }
                arr[k+i] = value;
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_43573824/article/details/88562567