[LeetCode] Product of Array Except Self

本文介绍了一种算法,该算法可以在O(n)的时间复杂度内计算出一个整数数组中每个元素对应的除自身以外所有元素的乘积。通过分别预计算左侧和右侧元素的乘积,并最终将两者相乘得出结果。

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

     个人觉得这道题挺好玩的哈哈。~

     这道题比较常规的思路,也是我的思路就是分别先求出这个数右边的所有数的乘积和左边所有数的乘积然后再左右两个乘积相乘。

     按照这个思路的话首先就需要3个int[]来分别store右边的乘积,左边的乘积以及总的乘积了。

     需要注意,因为乘积是不包含这个数的,以左边乘积计算为例:loop是从i=0开始,那么第一个乘积计算的就应该是left[i+1]而非left[i]。

     而且从最开始left[1]计算的时候,要提前设定left[0]=1,因为我们没有办法用公式算出left[0]的值,当只有一个数的时候,他的乘积只能是本身乘以1。

     因此同理,从右边开始的话,right[nums.length-1]也要设定为1,而右边也是从right[i-1]开始。

     代码如下:

public class Solution {
    public int[] productExceptSelf(int[] nums) {
        int[] result=new int[nums.length];
        int[] left= new int[nums.length];
        int[] right=new int[nums.length];
        
        left[0]=1;
        right[nums.length-1]=1;
        
        //left side
        for(int i=0;i<nums.length-1;i++){
            left[i+1]=left[i]*nums[i];
        }
        //right side
        for(int i=nums.length-1;i>0;i--){
            right[i-1]=right[i]*nums[i];
        }
        //together
        for(int i=0;i<nums.length;i++){
            result[i]=left[i]*right[i];
        }
        return result;
    }
}

 

转载于:https://www.cnblogs.com/orangeme404/p/4729189.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值