一、数组_数组的遍历_628. 三个数的最大乘积

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

示例 1:

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

输入:nums = [1,2,3,4]
输出:24
示例 3:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-of-three-numbers

暴力搜索法
1.这里只要穷举所有的情况,并且记录最大值。
2.这里将所有的情况列举出来,并且记录i,j,k的所有可能性,这里记录max_value
3.这里搜索的时间过长,LeetCode提交超出时间限制

int maximumProduct(vector<int>& nums) {
    int max_value = INT_MIN;

    for(int i = 0; i < nums.size() - 2; i++) {
        for(int j = i + 1; j < nums.size() - 1; j++) {
            for(int k = j + 1; k < nums.size(); k++) {
                int value = nums[i] * nums[j] * nums[k];

                if(value > max_value) {
                    max_value = value;
                }
            }
        }
    }

    return max_value;
}

排序方法:
1.将nums数组排序,排序后找到数组中最大的三个数乘积自然最大【都是非正数或非负数的情况】
2.因为这里是三个数的乘积,三个正数的乘积一定是正的,三个负数的乘积一定是负的
3.当nums中有正有负的时候,这时候除了要计算三个最大数外,还需要计算两个负数最大*一个正数最大,这两者取最大

//这里定义比较函数,若是a>b的话,则返回true,a<b的话返回false,则需要换位置
//sort(nums.begin(), nums.end(),cmp);  将cmp函数放入到排序函数中
bool cmp(int a, int b) {
    return a > b;
}
int maximumProduct(vector<int>& nums) {
    int max_value = INT_MIN;
    int len = nums.size();
    //void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
    //first是数组的起始地址,last是数组的结束地址,comp是排序的方式
    //默认的排序方式是升序
    sort(nums.begin(), nums.end());
    return max(nums[len - 1] * nums[len - 2] * nums[len - 3], nums[0] * nums[1] * nums[len - 1]);
}

线性扫描
1.个人感受:有时间算法题,编程技巧应该是次要的,最主要的是你要理解这个题的本质是想让你求出什么东西
这才是最根本的,若是这点没想清楚,无论怎么写的代码都不是最优的,你一定要明白这个道理
2.这里其实就是让你记录最大的三个数和最小的两个数,最终选择一个大的返回
3.这里414题有所不同,之前的那题不可以重复的,本题是可以重复的

int maximumProduct(vector<int>& nums) {
    //这里a,b,c是保存最大的三个数,d,e是保存最小的两个数,a最大,d最小
    //这里有可能最大的三个数和最小的两个数中会有相同的,这里没有关系,只要保证最大和最小即可。
    long a = LONG_MIN, b = LONG_MIN, c = LONG_MIN;
    long d = LONG_MAX, e = LONG_MAX;

    //这里即没有空的情况,也不会有重复的情况,所以代码相对容易
    //从数组中遍历每个数字
    for(int i = 0; i < nums.size(); i++) {
        int num = nums[i];

        if(num > a) {
            c = b;
            b = a;
            a = num;
        } else if(num > b) {
            c = b;
            b = num;
        } else if(num > c) {
            c = num;
        }

        if(num < d) {
            e = d;
            d = num;
        } else if(num < e) {
            e = num;
        }
    }

    return max(a * b * c, a * d * e);
}
int main() {
    vector<int> nums = { 1, 2, 3 };
    int result = maximumProduct(nums);
    cout << result << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值