(动态规划) 剑指 Offer 66. 构建乘积数组——【Leetcode每日一题】

❓ 剑指 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

💡思路:动态规划

由于不能使用除法,所以只能使用乘法,可以使用左右乘积:

  • B[i] 的乘积可以看成两部分A[0]×A[1]×...×A[i-1]A[i+1]×...×A[n-1]
    • 前半部分可以 从左到右 累乘得到,存入到B[i]中;
    • 后半部分则可以 从右到左 雷乘得到,然后再乘到 B[i] 上。

🍁代码:(C++、Java)

C++

cpp 复制代码
class Solution {
public:
    vector<int> constructArr(vector<int>& a) {
        int n = a.size();
        vector<int> ans(n);
        if(n == 0) return ans;
        ans[0] = 1;
        for(int i = 1; i < n; i++){  /* 从左往右累乘 */
            ans[i] = ans[i - 1] * a[i - 1];
        }
        int temp = a[n - 1];
        for(int i = n - 2; i >= 0; i--){ /* 从右往左累乘 */
            ans[i] *= temp;
            temp *= a[i];
        }
        return ans;
    }
};

Java

java 复制代码
class Solution {
    public int[] constructArr(int[] a) {
        int n = a.length;
        int[] ans = new int[n];
        if(n == 0) return ans;
        ans[0] = 1;
        for(int i = 1; i < n; i++){  /* 从左往右累乘 */
            ans[i] = ans[i - 1] * a[i - 1];
        }
        int temp = a[n - 1];
        for(int i = n - 2; i >= 0; i--){ /* 从右往左累乘 */
            ans[i] *= temp;
            temp *= a[i];
        }
        return ans;
    }
}

🚀 运行结果:

🕔 复杂度分析:

  • 时间复杂度 : O ( n ) O(n) O(n),其中 n 为是数组 a 的大小,从左到右或从右到左遍历计算都是 O ( n ) O(n) O(n) 的时间复杂度。
  • 空间复杂度 : O ( 1 ) O(1) O(1),输出数组不算进空间复杂度中,因此我们只需要常数的空间存放变量。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN---力扣专栏,每日更新!

注: 如有不足,欢迎指正!

相关推荐
Hcoco_me2 小时前
大模型面试题17:PCA算法详解及入门实操
算法
跨境卫士苏苏2 小时前
亚马逊AI广告革命:告别“猜心”,迎接“共创”时代
大数据·人工智能·算法·亚马逊·防关联
云雾J视界3 小时前
当算法试图解决一切:技术解决方案主义的诱惑与陷阱
算法·google·bert·transformer·attention·算法治理
Xの哲學3 小时前
Linux Miscdevice深度剖析:从原理到实战的完整指南
linux·服务器·算法·架构·边缘计算
夏乌_Wx3 小时前
练题100天——DAY23:存在重复元素Ⅰ Ⅱ+两数之和
数据结构·算法·leetcode
立志成为大牛的小牛4 小时前
数据结构——五十六、排序的基本概念(王道408)
开发语言·数据结构·程序人生·算法
沿着路走到底4 小时前
将数组倒序,不能采用reverse,算法复杂度最低
算法
IDIOT___IDIOT5 小时前
KNN and K-means 监督与非监督学习
学习·算法·kmeans
Hcoco_me5 小时前
大模型面试题18:t-SNE算法详解及入门实操
算法