能不排序咱就不排序

49 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

 

示例 1:

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

二、思路分析:

很明显最大的乘积要么全是正数相乘(三个前三大的正数),要么就是两个负数相乘再和一个正数相乘(两个最小的负数和一个最大的正数),这样我们就可以解决这一道题目了,那么最简单的想法就是进行排序之后获取刚才说的这些值然后计算出结果进行比较就可以了。时间复杂度是O(logn)这样我们肯定是不会满足的,我们思考一下其实要找的就那几个值,那就和找最大的值思路类似我们有没可能在一次遍历中,就完成这样的操作,实现一个时间复杂度为O(n)的算法。

我们只需要5个变量分保存前三大,和前二小,这样每次进行循环比较如果改变了最大的那个,那么原来的最大值就给到第二大,依次类推,最小值的求取也是同理的。

三、AC 代码:

代码一:

/**
 * @param {number[]} nums
 * @return {number}
 */
var maximumProduct = function(nums) {
    nums.sort((a,b)=>a-b);
    let tem1=nums[0]*nums[1]*nums[nums.length-1];
    let tem2=nums[nums.length-1]*nums[nums.length-2]*nums[nums.length-3]
    return tem1>tem2?tem1:tem2;
};

代码二

/**
 * @param {number[]} nums
 * @return {number}
 */
var maximumProduct = function(nums) {
    let firstMax=-Infinity;
    let secondMax=-Infinity;
    let thirdMax=-Infinity;
    let firstMin=Infinity;
    let secondMin=Infinity;
    for(let i=0;i<nums.length;i++){
        if(nums[i]>firstMax){
            thirdMax=secondMax;
            secondMax=firstMax;
            firstMax=nums[i];
        }else if(nums[i]>secondMax){
            thirdMax=secondMax;
            secondMax=nums[i];
        }else if(nums[i]>thirdMax){
            thirdMax=nums[i];
        }
        if(nums[i]<firstMin){
            secondMin=firstMin;
            firstMin=nums[i];
        }else if(nums[i]<secondMin){
            secondMin=nums[i];
        }
    }
    let tem1 = firstMin*secondMin*firstMax;
    let tem2 = firstMax*secondMax*thirdMax;
    return tem1>tem2?tem1:tem2;
};

四、总结:

简单的题目仔细思考更快的方法,带来的收益不比中等题要少哦。