题目描述:
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
**说明:**请不要使用除法,且在 O(n) 时间复杂度内完成此题。
解题思路:
拿到题目,输出除自身以外其余数的乘积,觉得题目很简单。直接先算出数组所有元素的乘积,再除以本身,不就是其余数的乘积嘛。仔细读题发现,除法是被禁止的。
又想到用双层循环来做,第一层循环遍历数组,第二层循环计算除本身以外所有元素的乘积,发现又被题目禁止了,要求O(n)的复杂度。
一时难住了我,找一下解题思路吧。
实际上除本身以外其余数的乘积,是由该数本身左边数的乘积与右边数的乘积相乘得到的。
如,输入: [1,2,3,4],顺序记录左边数乘积的结果为[1,1,2,6],逆序记录右边数乘积的结果为[1,4,12,24],所以最终的结果为[1 * 24,1 * 12,2 * 4,6 * 1]。思路有了,开始实现吧。
代码实现:
public static int[] productExceptSelf(int[] nums) {
int length = nums.length;
int[] leftMul = new int[length];
int[] rightMul = new int[length];
int[] output = new int[length];
leftMul[0] = 1; //原数组左边第一个元素左边无元素,赋初值1
rightMul[0] = 1; //原数组最后一个元素右边无元素,赋初值1
//逆序记录原数组每个元素右边数的乘积
//顺序记录原数组每个元素左边数的乘积
for (int i = 1; i < length; i++) {
leftMul[i] = leftMul[i - 1] * nums[i - 1];
rightMul[i] = rightMul[i - 1] * nums[length - i] ;
}
//将每个数的左边数的乘积与右边数的乘积相乘得到最终结果
for (int i = 0; i < length; i++) {
output[i] = leftMul[i] * rightMul[length - 1 - i];
}
return output;
}
运行结果: