题目:
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.)
思路:
1. 计算所有数相乘的结果,并记录数组中"0"的个数
2. 再次逐一便利初始给定的数组,根据其中"0"的个数和出现的位置做处理
3. 当只有一个0的时候,结果为除掉这个0的剩下的数的乘积
4. 当有多个0的时候,结果为全零的数组
代码:
public static int[] productExceptSelf(int[] nums) { int[] arrResult = new int[nums.length]; int iTemp =1; int i0Counter=0; for(int i =0;i < nums.length;i++){ if(nums[i]!= 0){ iTemp= iTemp * nums[i]; } else{ i0Counter++; } } if(i0Counter ==0 ){ for(int i =0;i < nums.length;i++){ arrResult[i] = iTemp/nums[i]; } return arrResult; } else if(i0Counter ==1 ){ for(int i =0;i < nums.length;i++){ if(nums[i] == 0){ arrResult[i] = iTemp; } else{ arrResult[i] = 0; } } return arrResult; } else{ for(int i =0;i < nums.length;i++){ nums[i] =0; } return arrResult; } }
分析:这个解法时间复杂度超了,使用了额外的空间,并且使用了除法
思路2:遍历累乘的时候,“除去”“当前位置”的元素
1. 先计算当前位置左侧元素的乘积,记录在输出数组的当前位置上,这样不使用额外的存储空间
2. 再从右边遍历,记录当前位置右侧的所有元素的乘积,记录在一个额外的位置上
3. 将两个数组再逐一相乘
代码如下:
public static int[] productExceptSelf(int[] nums) { int[] arrResult = new int[nums.length]; int[] arrRight = new int[nums.length]; arrResult[0] = 1; for(int i = 1;i<nums.length; i++ ){ arrResult[i] = arrResult[i-1]*nums[i-1] ; } arrRight[nums.length-1] = 1; for(int i = nums.length-2; i>= 0; i-- ){ arrRight[i] = arrRight[i+1]*nums[i+1] ; } for(int i = 0;i<nums.length; i++ ){ arrResult[i] = arrResult[i]*arrRight[i] ; } return arrResult; }