通知 网站从因情语写改为晴雨,这个网站的模板也从calmlog_ex改为 whimurmur

leetcode 剑指 Offer 66. 构建乘积数组

65人浏览 / 0人评论 / | 作者:whisper  | 分类: 剑指offer2  | 标签: 剑指offer2  | 

作者:whisper

链接:https://www.proprogrammar.com/article/850

声明:请尊重原作者的劳动,如需转载请注明出处


剑指 Offer 66. 构建乘积数组

给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。

示例:

输入: [1,2,3,4,5]
输出: [120,60,40,30,24]

提示:

  • 所有元素乘积之和不会溢出 32 位整数
  • a.length <= 100000

难度:中等;标签:无;编程语言:JAVA


我的解法

class Solution {
    public int[] constructArr(int[] a) {
        if(a.length == 0)return a;
        int[] pre = new int[a.length + 1], post = new int[a.length];
        pre[0] = 1;
        post[post.length - 1] = 1;
        for(int i = 1; i < a.length; i++)pre[i] = pre[i - 1] * a[i - 1];
        for(int i = a.length - 2; i >= 0; i--)post[i] = post[i + 1] * a[i + 1];

        for(int i = 0; i < a.length; i++){
            a[i] = pre[i] * post[i];
        }

        return a;
    }
}

学过前缀(后缀)和的比较好理解,这里用的是前缀和后缀积,如一个位置i,那么用0~i-1的前缀积乘以i+1~len-1的后缀积就是i位置的结果,可以学一下计算前(后)缀积(和)的方法


其它解法

class Solution {
    public int[] constructArr(int[] a) {
        if (Objects.isNull(a) || a.length == 0) {
            return new int[]{};
        }
        int[] res = new int[a.length];
        int left = 1;
        for (int i = 0; i < res.length; i++) {
            res[i] =left;
            left *= a[i];
        }
        int right = 1;
        for (int i = res.length - 1; i >= 0; i--) {
            res[i] *= right;
            right *= a[i];
        }
        return res;
    }
}

这里的优点是用两个变量代替前后缀积两个数组,方法是一样的,但代码比较好


亲爱的读者:有时间可以点赞评论一下

点赞(0) 打赏

全部评论

还没有评论!
广告位-帮帮忙点下广告