プログラミングの美:サブアレイの最大積
1706 ワード
タイトル:Nの長さの整数配列を指定します。乗算だけで除算は許されません。N-1個の数の組み合わせの積の最大のセットを計算して、アルゴリズムの時間複雑さを書き出します。
最も直観的な解法O(n 2)
最適化解法O(n)
最も直観的な解法O(n 2)
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) = 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;
}
}