给你一个下标从 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) 2 5 (-9) = 1350 ,这是可以得到的最大实力值。
示例 2:
输入:nums = [-4,-5,-4]
输出:20
解释:选择下标为 [0, 1] 的学生。得到的实力值为 20 。我们没法得到更大的实力值。
提示:
1 <= nums.length <= 13
-9 <= nums[i] <= 9
题解:
直接暴力跑一遍把所有非零数相乘即可判断正负,就是有些地方需要注意:
- 如果数组中只有一个数。不管正负都需要范围他,因为题目中说了非空。
- 如果全零,也要返回零。
- 如果是有一个负数,其余全是零,那么就应该返回0。选零要比选负数大。
- 如果积为负数,那么一定要除最小的负数。
class Solution {
public:
long long maxStrength(vector<int>& nums) {
long long ans = 1;
sort(nums.begin(),nums.end());
int tmp=1;
for(int i = 0;i<nums.size();i++){
if(nums[i]>0){
ans=ans*nums[i];
}else if(nums[i]<0){
ans=ans*nums[i];
tmp=nums[i];
}
}
if (nums.size()==1) return nums[0];
if(nums[0]==0&&nums[nums.size()-1]==0) return 0;
if(nums[0]<0){
if(nums.size()>=2){
if(nums[1]==0&&nums[nums.size()-1]==0) return 0;
}
else return nums[0];
}
if (ans<0){
ans=ans/tmp;
}
return ans;
}
};