一道某公司的笔试题,int*a[]1..n 整数数组, 求n-1个数的乘积的最大值。只能用乘法,不用除法。
用除法就太简单了,全部连乘,然后逐个除,注意判断有0的,遍历就最大。
第一眼反应分类讨论,按照逻辑来分:
1) 有0的话, 若>=2个0, return 0;=1个0, 剩余奇数个负数,return 0,偶数个,余下乘积
2) 无0的话,n为奇,若奇个负数,去掉最大负数,偶个负数,去掉最小正数。
n为偶,若奇个负数,去掉最大负数,偶个负数,去掉最小正数。
代码,一遍遍历记录0的个数,以及最大负数,最小正数index,然后根据情况返回值,最多需要两趟遍历,时复O(n)空复O(1)
用除法就太简单了,全部连乘,然后逐个除,注意判断有0的,遍历就最大。
第一眼反应分类讨论,按照逻辑来分:
1) 有0的话, 若>=2个0, return 0;=1个0, 剩余奇数个负数,return 0,偶数个,余下乘积
2) 无0的话,n为奇,若奇个负数,去掉最大负数,偶个负数,去掉最小正数。
n为偶,若奇个负数,去掉最大负数,偶个负数,去掉最小正数。
代码,一遍遍历记录0的个数,以及最大负数,最小正数index,然后根据情况返回值,最多需要两趟遍历,时复O(n)空复O(1)
后来看了答案思路基本一致,但是发现直接用第一遍遍历的值P=a1....an 可以将其中的相同处理的case合并,例如P>0 就去掉最小正数,P<0 去掉最大负数,=0 则看0的count
之前看到过一道这个题目,当时没仔细想,但是现在忘记在哪里看到了。。。