剑指 Offer 第66题:构建乘积数组

1、前言

题目描述

2、思路

这个东西看似是求乘积,其实它的思想在很多地方用到:使用存储存储之前的信息,可以不用遍历。这边其实是使用 leftMemo、rightMemo 存储 i 左右两边的乘积,然后只需要一次遍历即可。

3、代码

class Solution {
    public int[] constructArr(int[] a) {
        if(a == null || a.length == 0){
            return new int[]{};
        }
        if(a.length == 1){
            return new int[]{1};
        }

        int n = a.length;
        int[] leftMemo = new int[n];
        leftMemo[0] = a[0];
        for(int i = 1; i < n; i++){
            leftMemo[i] = leftMemo[i - 1] * a[i];
        }
        int[] rightMemo = new int[n];
        rightMemo[n - 1] = a[n - 1];
        for(int i = n - 2; i >= 0; i--){
            rightMemo[i] = rightMemo[i + 1] * a[i];
        }

        int[] res = new int[n];
        res[0] = rightMemo[1];
        res[n - 1] = leftMemo[n - 2];
        for(int i = 1; i < n - 1; i++){
            res[i] = leftMemo[i - 1] * rightMemo[i + 1];
        }
        
        return res;
    }
}

你可能感兴趣的:(剑指 Offer 第66题:构建乘积数组)