leetcode 238: Product of Array Except Self

题目:

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].

解析:

题目是说给定一个数组nums,返回一个输出数组output,里面每个元素outpus[i]是nums中除了第i个元素的乘积。

最容易想到的是先求nums数组所有数的乘积cj,  然后output[i] = cj / nums[i]。不过题目规定不能用除法所以不可取。

正解是:由于output[i] = nums[0...i-1] * nums[i+1,...n-1],所以可以先求出nums[0,...,i-1],然后与[i+1,...,n-1]相乘

比如[1,2,3,4]  , 新建数组返回数组output=[1,1,1,1],output[i] = nums[0] * nums[1] *...*nums[i-1],1<=i<3

所以左边相乘的结果为output = [1,1,2,6],而后与右边的相乘。

output[i] = output[i] * nums[i+1]*...*nums[3],   0<=i<3;

i = 2时,output[2] = output[2] * nums[3] = 2*4 = 8

i = 1时,output[1] = output[1] * nums[2]*nums[3] = 1*3*4=12

i = 0时,output[0] = output[0] * nums[1] * nums[2] * nums[3] = 24

即output = [24,12,8,6]

代码如下:

public class Solution {
    public int[] productExceptSelf(int[] nums) {
        int[] output = new int[nums.length];
        //为output赋初值
        for (int i=0;i<nums.length;i++){
        	output[i] = 1;
        }
        int left = 1;
        //output先保存左边的乘积
        for (int i=1;i<nums.length;i++){
        	//第一个数的左边没有,所以i初值为1
        	left *= nums[i-1];
        	output[i] = left;
        }
        int right = 1;
        //然后再与右边的乘积相乘
        for (int i=nums.length-2;i>=0;i--){
        	//最后一个数的右边没有,所以i初值为n-2
        	right *= nums[i+1];
        	output[i] *= right;
        }
        
        return output;
    }
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值