小试牛刀第二天

6.28 三个数的最大乘积

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

来源:力扣

提示:

  • 3 <= nums.length <= 104
  • -1000 <= nums[i] <= 1000

首先,我想到的是,用冒泡排序,把它排序出来,然后再进行计算。

1. 比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换它们的位置

2. 每一次比较,都会产生出一个最大,或者最小的数字

3. 下一轮则可以少一次排序

4. 依次循环,直到结束

三种情况:

1.全是正数

2.全是负数

3.有正有负

情况1,取最后3个数为最大乘积

情况2,取最后3个数为最大乘积

情况3,取前两个负数与数组最后一个正数的乘积为最大乘积,或者是取最后3个数为最大乘积

综上所诉,取最后3个数为最大乘积,或者是取前2负数与最后一个正数的乘积

class Solution {

    public int maximumProduct(int[] nums) {

        int max;

        int t;

          int n=nums.length;

            for(int i=0;i<n-1;i++){

            for(int j=0;j<n-i-1;j++)

            if(nums[j]>nums[j+1])

            {

                t=nums[j];

                nums[j]=nums[j+1];

                nums[j+1]=t;

            }

        }

         return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);

    }

}

但是的话,由于冒泡排序繁杂,其性能还是不友好的。用时大概1586ms

JAVA API中提供了一个工具类Arrays供我们使用,它可以让我们操作数组更快,更简便,实际上,它的底层,也是类似于冒泡排序的写法的,其中Arrays.sort(),就是我们今天的主角,默认是升序排序的。

class Solution {
    public int maximumProduct(int[] nums) {
       int n=nums.length;
       Arrays.sort(nums);
        return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
    }
}

​​​​​​是不是很懵,怎么这么的简短,没错,它就是这么的厉害。用时12ms.

实际上,上面的排序算法是不安全的,后面我们在说。

算法的目的就是解决问题,但是如果一个程序跑了很久,它就是一个垃圾算法,所以算法的解决问题的速度尤其重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值