Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].
Solve it without division and in O(n).
For example, given [1,2,3,4], return [24,12,8,6].
Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)
Subscribe to see which companies asked this question
利用乘法相关的知识,把所有的数字乘一遍,再挨个除一遍得出的结果就是所要答案,零的时候另外讨论。
public class Solution {
public int[] productExceptSelf(int[] nums) {
int mul = 1 ;
int mul2 = 1;
int zeroNum = 0;
for(int i = 0; i < nums.length;i++)
{
mul2 *= nums[i];
if(nums[i]!=0)
mul*=nums[i];
else zeroNum++;
}
if(zeroNum == nums.length) return nums;
for(int i = 0 ; i < nums.length ; i++)
{
if(nums[i] == 0&&zeroNum == 1)
nums[i] = mul;
else if(nums[i]==0&&zeroNum > 1)
nums[i] = mul2;
else
nums[i] = mul2/nums[i];
}
return nums;
}
}
下面这个方法更好一点,没有过多的用数学知识,单纯的前后遍历来实现
public int[] productExceptSelf(int[] nums) {
int[] result = new int[nums.length];
int size = nums.length;
for(int i = 0; i < size; i++) {
result[i] = 1;
}
for(int i = 1; i < size; i++) {//使得result[i]的结果是i前面的所有元素的乘积
result[i] = result[i-1]*nums[i-1];
}
int tmp = nums[size-1];
for(int i = size - 2; i >= 0; i--) {
//从后向前,把result[i]没有乘过的元素依次相乘
result[i] *= tmp;
tmp *= nums[i];
}
return result;
}