写在前边
期末考试终于结束了!放假了放假了!成绩虽然不知道怎么样,但是至少对得起良心了,考试结束意味着要重新开始刷题了,在家里也不能够懈怠!
这次刷的题目是昨天的一道简单题,然而简单题也卡到我了。。。太长时间不做题,确实会手生。
先看题目:
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入:nums = [1,2,3]
输出:6
示例 2:
输入:nums = [1,2,3,4]
输出:24
示例 3:
输入:nums = [-1,-2,-3]
输出:-6
提示:
3 <= nums.length <= 104
-1000 <= nums[i] <= 1000
很简单的一道题目,找出一个数组中三个数相乘最大的值,刚开始看我还以为是动态规划,但是后来发现不是。。。我想直接排序取前三个,又发现如果有负数参与进来会很麻烦,就这样我突然不知道怎么做了。看了题解才知道,原来我想到的两种情况,就是所有的情况。。。但是我没敢写,这得怪自己脑子没转过来,如果直接推理出来只有这两种情况就好了。
所以这道题,如果数组中全是非负数或者是非正数,直接去前三个最大的数相乘就好,但是如果有正有负,最大值可能在最大的三个值的乘积和最小的两个数(全是负数)与最大值的乘积,比如:-100,-99,1,2,3,这个数组中三个数乘积最大值就是-100*-993而不是12*3.
想到这里,其实我当时还是不知道怎么写出来代码,因为情况太多了,我把自己绕在死胡同里了,老想着直接把最大值选出来并输出,其实可以把这么多个值放在一起,用一个max函数直接选取最大值就好了。。。实在是脑子抽了。
像这道题,我认为让我学到的东西很多,一是要分析好题目,不要被暂时的复杂迷惑,其次是不能一根筋,得活学活用,多用标准库的的东西。
代码如下:
#include"iostream"
#include"vector"
#include"algorithm"
using namespace std;
class Solution {
public:
int maximumProduct(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
cout<<nums[i]<<endl;
}
return max(nums[0]*nums[1]*nums[nums.size()-1],nums[nums.size()-1]*nums[nums.size()-2]*nums[nums.size()-3]);
}
};
int main()
{
vector<int> nums={-100,-99,1,2,3};
Solution s;
int result=s.maximumProduct(nums);
cout<<result<<endl;
system("pause");
return 0;
}