编程之美:子数组的最大乘积
2013-04-10 18:56
411 查看
题目:给定一个长度为N的整数数组,只允许用乘法不允许用除法,计算N-1个数组合的乘积最大的一组,并写出算法的时间复杂度。
最直观的解法O(n2)
优化解法O(n)
最直观的解法O(n2)
public static int getTheExpectValueNormal(int[] data){ long result = Long.MIN_VALUE; int index = -1; for(int i = 0; i < data.length; i++){ long r = 1; for(int j = 0; j < data.length; j++){ if(j != i){ r *= data[j]; } } if(result < r){ result = r; index = i; } } return data[index]; }
优化解法O(n)
public static int getTheExpectValue(int[] data){ int negativeCount = 0;//负数个数 int min = Integer.MAX_VALUE;//最小值 int absMin = Integer.MAX_VALUE;//绝对值最小的值 int minPositive = Integer.MAX_VALUE;//最小正数 int maxNegative = Integer.MIN_VALUE;//最大负数 for(int i = 0; i < data.length; i++){ negativeCount += data[i] < 0 ? 1 :0; min = min < data[i] ? min : data[i]; absMin = Math.abs(absMin) <Math.abs(data[i]) ? absMin : data[i]; minPositive = data[i] >= 0&& data[i] < minPositive ? data[i] : minPositive; maxNegative = data[i] < 0 &&data[i] > maxNegative ? data[i] : maxNegative; } if(absMin == 0){//绝对值最小的值为0的时候:如果负数个数为偶数个,说明其它值的乘积>=0,返回0;否则返回非0任意值 return negativeCount % 2 == 0 ? 0 :maxNegative; }else if((negativeCount % 2 == 0) != (absMin > 0)){//判断排除绝对值最小的值后剩余值的乘积是否为负数,如果是则需要特殊处理 if(absMin > 0){//返回最大负数(绝对值最小的负数) return maxNegative; }else{//如果全部是负数,返回最小的值 return negativeCount == data.length ?min : minPositive; } }else{ return absMin; } }
相关文章推荐
- 《编程之美》学习笔记——2.13子数组的最大乘积
- 编程之美:子数组的最大乘积
- 编程之美2.13子数组的最大乘积Java版
- 编程之美---子数组最大乘积
- 编程之美2.13 子数组的最大乘积
- 编程之美之子数组的最大乘积
- 子数组的最大乘积——编程之美2.13
- 子数组的最大乘积-编程之美
- 编程之美2.13 子数组的最大乘积
- 编程之美系列之求子数组的最大乘积
- 编程之美2.13 子数组最大乘积
- 编程之美-2.13 子数组最大乘积
- 子数组的最大乘积(编程之美2.13,两种解法)
- 编程之美--子数组中的最大乘积
- 子数组的最大乘积——编程之美2.13
- 编程之美:第二章 数字之魅 2.13子数组的最大乘积
- 编程之美-2.13-子数组的最大乘积
- js同时寻找数组中最大值和最小值,编程之美解法三
- 子数组的最大乘积
- Array-----152. Maximum Product Subarray(最大连续子数组乘积)