[LinkedIn] Array of products of all other numbers (except/without the current number ) (no division)

来源:互联网 发布:人工智能 创投 编辑:程序博客网 时间:2024/05/22 00:31

Given an array of numbers, nums, return an array of numbers products, where products[i] is the product of all nums[j], j != i.

Input : [1, 2, 3, 4, 5]
Output: [(2*3*4*5), (1*3*4*5), (1*2*4*5), (1*2*3*5), (1*2*3*4)]
= [120, 60, 40, 30, 24]
You must do this in O(N) without using division.

先建立一个array A,从右到左遍历,A[i]是这个东西右边所有东西的product。
然后从左边开始遍历,maintain在i位置左边的乘积, 乘上A[i]即可。

public static int[] product(int[] input) {     int[] rightProd = new int[input.length];         p = 1;         for (int i = input.length - 1; i >= 0; i--) {      rightProd[i] = p;      p *= input[i];    }    int[] resProd = new int[input.length];    int left = 1;    for (int i = 0; i < input.length; i++) {      resProd[i] = left * rightProd[i];      left *= input[i];    }    return resProd;  }

Another way, O(1) space

//here left is always the product on i's left //and right is always the product on length-1-i's right.public int[] products(int[] A) {    if (A == null || A.length == 0) {        return null;    }    int[] B = new int[A.length];    for (int i = 0; i < B.length; ++i) {        B[i] = 1;    }    int left = 1, right = 1;    for (int i = 0; i < A.length; ++i) {        B[i] *= left;        B[A.length-1-i] *= right;        left *= A[i];        right *= A[A.length-1-i];    }    return B;}
0 0