最大乘积问题的思考

最大乘积问题的思考


LeetCode 628. 三个数的最大乘积

贪心+分情况讨论。

1.全为非负数,或者全是非正数。

​ 答案为最大的三个数的乘积。

2.有正数和负数。

​ 答案可能是一个最大的正数和两个最小的正数,然后也可能是三个最大的正数。


做法1:排序 O ( n l o g n ) O(nlogn) O(nlogn)

做法2:维护几个最值遍历,扫一遍数组 O ( n ) O(n) O(n)


Hint

求n个数最大乘积

思路:贪心。

时间复杂度: O ( n ) O(n) O(n)

把数按照负数和正数分组,然后都每组都贪心地两两去乘。


从n个数中选k个数的最大乘积

例题讲解

排序+贪心。

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

先从小到大排序,然后贪心两个两个选。

如果 k k k是奇数,就把最大值赋给 a n s , k − − ans,k-- ans,k,如果最大值此时是负数说明答案只能为负。

否则双指针,每次贪心的选。


如果上面的问题都变成最小乘积呢?

拿上面一个问题来考虑,还是类似,如果 k k k是奇数就把最小值赋给 a n s , k − − ans,k-- ans,k,如果最小值是正数则每次两两取乘积较小的,否则取乘积较大的。

如果 k k k是偶数,也默认取乘积较小的。


你可能感兴趣的:(贪心)