法一(左右累乘)
/**
* 法一(左右累乘)
* 1. 思路
* 当前位置的结果就是它左部分的乘积再乘以它右部分的乘积
* 2. 理解
* 原数组: [1 2 3 4]
* 左部分的乘积: 1 1 1*2 1*2*3
* 右部分的乘积: 2*3*4 3*4 4 1
* 结果: 1*2*3*4 1*3*4 1*2*4 1*2*3*1
* 3. 复杂度
* 时间复杂度 O(n)
* 空间复杂度 0(1)
*
* @param nums
* @return
*/
public int[] productExceptSelf(int[] nums) {
int len = nums.length;
int[] ans = new int[len];
int left = 1, right = 1;
for (int i = 0; i < len; i++) { // 求左部分乘积
ans[i] = left;
left *= nums[i];
}
for (int i = len - 1; i >= 0; i--) { // 求右部分乘积的同时,将最后的计算结果一起求出来
ans[i] *= right;
right *= nums[i];
}
return ans;
}
本地测试
/**
* 238. 除自身以外数组的乘积
*/
lay.showTitle(238);
Solution238 sol238 = new Solution238();
int[] nums238 = new int[]{1, 2, 3, 4};
System.out.println(Arrays.toString(nums238));
System.out.println(Arrays.toString(sol238.productExceptSelf(nums238)));