ProductOfArrayExceptSelf-計算每個元素除自己之外其他元素的乘積

/**
 * 給一個長度爲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] + "  ");
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章