/**
* 給一個長度爲n的數組,n>1,求每個元素的剔除自己其他元素的乘積
*/
public class ProductOfArrayExceptSelf {
private int[] input;
public ProductOfArrayExceptSelf(int[] input) {
this.input = input;
}
/**
* 累乘非0元素,再除(0要特殊處理)
* 時間複雜度O(n)
* 空間複雜度O(1)
* @return
*/
public int[] compute() {
int sumExcepetZero = 1;
int zeroCount = 0;
for (int i = 0; i < input.length; i++) {
if (input[i] == 0) {
zeroCount++;
continue;
}
sumExcepetZero *= input[i];
}
int[] output = new int[input.length];
for (int i = 0; i < input.length; i++) {
if (zeroCount > 1) {
output[i] = 0;
} else if (zeroCount == 0) {
output[i] = sumExcepetZero / input[i];
} else {
if (input[i] == 0) {
output[i] = sumExcepetZero;
} else {
output[i] = 0;
}
}
}
return output;
}
/**
* 不使用除法,從左往右遍歷一遍數組,求每個元素左邊各元素的乘積;從右往左遍歷一遍數組,計算每個元素右邊各元素的乘積
* 時間複雜度O(n)
* 空間複雜度O(1)
* @return
*/
public int[] compute2() {
int rightAccumulate = 1;
int[] output = new int[input.length];
for (int i = 0; i < input.length; i++) {
if (i == 0) {
output[i] = input[i];
continue;
}
output[i] = input[i] * output[i - 1];
}
for (int i = input.length - 1; i >= 0; i--) {
if (i == 0) {
output[i] = rightAccumulate;
rightAccumulate = output[i];
continue;
}
output[i] = rightAccumulate * output[i - 1];
rightAccumulate *= input[i];
}
return output;
}
public static void main(String[] args) {
int[] input = {1, 4, 2, 3, 3, 6};
ProductOfArrayExceptSelf productOfArrayExceptSelf = new ProductOfArrayExceptSelf(input);
int[] output = productOfArrayExceptSelf.compute2();
for (int i = 0; i < output.length; i++) {
System.out.print(output[i] + " ");
}
}
}
ProductOfArrayExceptSelf-計算每個元素除自己之外其他元素的乘積
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.