【LeetCode热题100】--238.除自身以外数组的乘积

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

【LeetCode热题100】--238.除自身以外数组的乘积_第1张图片

思路:

利用索引左侧所有数字的乘积和右侧所有数字的乘积(即前缀和后缀)相乘得到答案

算法:

1.初始化两个空数组L和R,对于给定索引i,L[i]代表的是i左侧所有数字的乘积,R[i]代表的是i右侧所有数字的乘积

2.需要用两个循环来填充L和R数组的值,对于数组L,L[0]应该是1,因为第一个元素的左边没有元素,对于其他元素: L [ i ] = L [ i − 1 ] ∗ n u m s [ i − 1 ] L[i] = L[i-1] * nums[i-1] L[i]=L[i1]nums[i1],同样,对于R,R[length-1]=1,其他元素: R [ i ] = R [ i + 1 ] ∗ n u m s [ i + 1 ] R[i] = R[i+1] * nums[i+1] R[i]=R[i+1]nums[i+1]

3.当R和L数组填充完成,只需要在输入数组上迭代,索引i处的值为 L [ i ] ∗ R [ i ] L[i]*R[i] L[i]R[i]

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;

        //L和R分别表示左右两侧的乘积列表
        int[] L = new int[n];
        int[] R = new int[n];

        int[] ans = new int[n];

        //L[i]为索引i左侧所有元素的乘积
        //对于索引为0的元素,左侧没有元素,所以L[0]=1
        L[0] = 1;
        for(int i =1;i<n;i++){
            L[i] = nums[i - 1] * L[i-1];
        }
        //R[i]为索引i右侧所有元素的乘积
        R[n - 1] = 1;
        for(int i = n-2;i>=0;i--){
            R[i] = nums[i + 1] * R[i + 1];
        }
        for(int i = 0;i<n;i++){
            ans[i] = L[i] * R[i];
        }
        return ans;
    }
}

你可能感兴趣的:(LeetCode,leetcode,算法,数据结构)