除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
(上述题目来源于LeetCode)
解法一(辅助数组)
class Solution {
public int[] productExceptSelf(int[] nums) {
//辅助数组
//所求乘积=左边所有数的乘积*右边所有数的乘积
int n = nums.length;
int[] answer = new int[n];
int[] left = new int[n];
int[] right = new int[n];
left[0] = nums[0];
for(int i = 1;i < n;i++){
left[i] = left[i - 1] * nums[i];
}
right[n - 1] = nums[n - 1];
for(int j = n - 2;j > 0;j--){
right[j] = right[j + 1] * nums[j];
}
for(int k = 1;k < n - 1;k++){
answer[k] = left[k - 1] * right[k + 1];
}
answer[0] = right[1];
answer[n - 1] = left[n - 2];
return answer;
}
}
解法二(判别0 + 辅助数组)
class Solution {
public int[] productExceptSelf(int[] nums) {
//判别0 + 辅助数组
//先判别0的个数,如果有两个及以上的0,那么无论如何乘积都等于0
//如果只有一个0,那么除了为0的那个下标外,其他乘积都为0
//如果没有0,运用辅助数组
int n = nums.length;
int[] answer = new int[n];
int count = 0;
int index = -1;
for(int i = 0;i < n;i++){
if(nums[i] == 0){
count++;
index = i;
}
}
if(count > 1){
Arrays.fill(answer,0);
}else if(count == 1){
Arrays.fill(answer,0);
answer[index] = 1;
for(int j = 0;j < n;j++){
if(j == index){
continue;
}else{
answer[index] = answer[index] * nums[j];
}
}
}else{
int[] left = new int[n];
int[] right = new int[n];
left[0] = nums[0];
for(int i = 1;i < n;i++){
left[i] = left[i - 1] * nums[i];
}
right[n - 1] = nums[n - 1];
for(int j = n - 2;j > 0;j--){
right[j] = right[j + 1] * nums[j];
}
for(int k = 1;k < n - 1;k++){
answer[k] = left[k - 1] * right[k + 1];
}
answer[0] = right[1];
answer[n - 1] = left[n - 2];
}
return answer;
}
}