文章目录
- 152.乘积最大子数组
- 2708.一个小组的最大实力值
乘积的最大情况分为两种,一种是 要求子数组是连续的,一种是要求数组是不用连续的
连续可以使用动态规划求解,非连续则使用贪心
152.乘积最大子数组
152.乘积最大子数组
思路分析:由于要求是连续的,那么当前的nums[i]来说,对应的以它结尾的子数组的情况,要么是自己独自开始,要么是接着前一个dp[i-1]的情况,所以总的来说,转移情况可以用动态规划来解决,也就是使用fmax和fmin来记录最大和最小的值
class Solution:def maxProduct(self, nums: List[int]) -> int:# 一样的思路n = len(nums)fmax = [1]*(n+1)fmin = [1]*(n+1)for i in range(n):fmax[i+1] = max(fmax[i]*nums[i],fmin[i]*nums[i],nums[i])fmin[i+1] = min(fmax[i]*nums[i],fmin[i]*nums[i],nums[i])# 直接排除第一个的初始值return max(fmax[1:])
2708.一个小组的最大实力值
2708.一个小组的最大实力值
思路分析:
该题并不能用动态规划来求解,而是使用贪心
来解决
class Solution:def maxStrength(self, nums: List[int]) -> int:zheng = [i for i in nums if i > 0]fu = [i for i in nums if i < 0]# 先记录当前的单个的最大值,当没有正数的时候或者负数的个数为1的时候,结果就是这个max(nums)ans = max(nums)# 不连续的话,用不了动态规划tmp = 1# 将全部的正数乘起来for i in zheng:tmp *= i # 负数的先升序排序,找到偶数对乘起来fu.sort()if len(fu) >= 2:for i in fu:tmp*= i if len(fu) % 2 == 1:tmp //= fu[-1]# 还得考虑只有一个负数,以及没有正数的情况,更新if len(zheng) > 0 or len(fu) >= 2:ans = max(ans,tmp)return ans