/**
* 自己的代码
* Runtime: 1 ms, faster than 100.00%
* Memory Usage: 49.4 MB, less than 90.80%
*/
class Solution {
public int[] productExceptSelf(int[] nums) {
int len = nums.length;
int[] res = new int[len], mul2 = new int[len]; // mul2[i] keeps the product of elements right to i
mul2[len - 1] = 1; // the rightest element's right product should be intialized as 1
for (int i = len - 2; i >= 0; i--) {
mul2[i] = mul2[i + 1] * nums[i + 1];
}
int pre = 1; // use pre to keep the products of elements left to current element, also initialize it as 1
for (int i = 0; i < len; i++) {
res[i] = pre * mul2[i];
pre *= nums[i];
}
return res;
}
}
/**
* discuss里看到的
* 基本思路是一样的,从左到右遍历一次,再从右到左遍历一次
* 但mul2数组都不用,直接先将i左侧的product保存在res[i],从后向前得到i右侧的product的时候再直接用res[i] *= rightProd
* 天才!
* Runtime: 1 ms, faster than 100.00%
* Memory Usage: 49.6 MB, less than 76.42%
*/
class Solution {
public int[] productExceptSelf(int[] nums) {
int len = nums.length;
int[] res = new int[len];
for (int i = 0, leftProd = 1; i < len; i++) {
res[i] = leftProd;
leftProd *= nums[i];
}
for (int i = len - 1, rightProd = 1; i >= 0; i--) {
res[i] *= rightProd;
rightProd *= nums[i];
}
return res;
}
}
/** * 自己的代码 * Runtime: 1 ms, faster than 100.00% * Memory Usage: 49.4 MB, less than 90.80% */class Solution { public int[] productExceptSelf(int[] nums) { int len = nums.length; int[] res = new int[len], mul2 = new int[len]; // mu.