2708 一个小组的最大实力
题目链接https://leetcode.cn/problems/maximum-strength-of-a-group
题目描述
‘’’
给你一个下标从 0 开始的整数数组 nums ,它表示一个班级中所有学生在一次考试中的成绩。老师想选出一部分同学组成一个 非空 小组,且这个小组的 实力值 最大,如果这个小组里的学生下标为 i0, i1, i2, … , ik ,那么这个小组的实力值定义为 nums[ i0] * nums[ i0] * nums[ i0] * … * nums[ i0] 。
请你返回老师创建的小组能得到的最大实力值为多少。
示例 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,那么返回0。
代码实现
go版本
import "math"
func maxStrength(nums []int) int64 {
l:=len(nums)
if l==1{
return int64(nums[0])
}
res:=1
a:=0
b:=0
for _,i:=range(nums){
if i>0{
a++
}else if i<0{
b++
}
}
if b<=1&&a==0{
return 0
}
if b%2==0{
for _,i:=range(nums){
if i!=0{
res=res*i
}
}
}else{
minNum := math.MinInt
for _,i:=range(nums){
if i!=0{
if i<0{
minNum=max(minNum,i)
}
res=res*i
}
}
res=res/minNum
}
return int64(res)
}
C++ 版本
class Solution {
public:
long long maxStrength(vector<int>& nums) {
long long res=1;
int n=nums.size();
if(n==1){
res=nums[0];
return res;
}
int a=0,b=0;
for(int i=0;i<n;i++){
if(nums[i]>0){
a++;
}else if(nums[i]<0){
b++;
}
}
if(a==0&&b<=1){
return 0;
}
if(b%2==0){
for(int i=0;i<n;i++){
if(nums[i]!=0){
res=res*nums[i];
}
}
}else{
int minNum=INT_MIN;
for(int i=0;i<n;i++){
if(nums[i]!=0){
res=res*nums[i];
if(nums[i]<0){
minNum=max(nums[i],minNum);
}
}
}
res/=minNum;
}
return res;
}
};
python版本
import sys
class Solution:
def maxStrength(self, nums):
n = len(nums)
if n == 1:
return nums[0]
res = 1
positive_count = 0
negative_count = 0
for num in nums:
if num > 0:
positive_count += 1
elif num < 0:
negative_count += 1
if positive_count == 0 and negative_count <= 1:
return 0
if negative_count % 2 == 0:
for num in nums:
if num != 0:
res *= num
else:
min_negative = -sys.maxsize
for num in nums:
if num != 0:
res *= num
if num < 0:
min_negative = max(min_negative, num)
res //= min_negative
return res