题目:给定一个长度为N的整数数组,只允许用乘法不允许用除法,计算N-1个数组合的乘积最大的一组,并写出算法的时间复杂度。
最直观的解法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; } }