2708. 一个小组的最大实力值(24.9.3)
题目
给定一个下标从 0 开始的整数数组 nums
,表示班级中所有学生在一次考试中的成绩。老师想选出一部分同学组成一个非空小组,且这个小组的实力值最大。如果这个小组里的学生下标为 i0,i1,i2,...ik
,那么这个小组的实力值为 nums[i0] * nums[i1] * nums[i2] *... * nums[ik]
。
要求返回老师创建的小组能得到的最大实力值。
示例 1:
输入:nums=[3,-1,-5,2,5,-9]
输出:1350
解释:一种构成最大实力值小组的方案是选择下标为[0,2,3,4,5]的学生。实力值为 3*(-5)25*(-9)=1350,这是可以得到的最大实力值。
示例 2:
输入:nums=[-4,-5,-4]
输出:20
解释:选择下标为[0,1]的学生。得到的实力值为 20。我们没法得到更大的实力值。
提示:
1<=nums.length<=13
-9<=nums[i]<=9
解题思路
假设我一个数为 X ,如果这个数是正数,那么想要其乘积最大,则要和一个 尽可能大的正数
相乘,如果是一个负数,则要和一个尽可能小的负数
或者是0
相乘,从上述思路中我们可以推出以下记录值最大值
最小值
,这两个值,要想得到这些值则需要注意以下四个值的比较:自生、当前数字、最大值与当前数字相乘、最小值与当前数字相乘
代码
/*
要想乘积最大,对于负数而言要是其变为正数,并且尽可能大,即负值当中的最小值在乘以一个负数
对于正数而言则是要求,两个值都大
*/
class Solution {
public:
long long maxStrength(vector<int>& nums) {
int n=nums.size();
long long min_num=nums[0];
long long max_num=nums[0];
for(int i=1;i<n;i++){
long long num=nums[i];
long long t=min_num;
min_num=min({min_num,num,min_num*num,max_num*num});
max_num=max({max_num,num,t*num,max_num*num});
}
return max_num;
}
};