238. 除自身以外数组的乘积

题目描述:
给定长度为 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;
        }

运行结果:
238. 除自身以外数组的乘积_第1张图片

你可能感兴趣的:(LeetCode)