(动态规划) 剑指 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---力扣专栏,每日更新!

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

相关推荐
机器学习之心10 分钟前
MATLAB基于近红外光谱检测的菠萝含水率预测(多种预处理+PLS)
人工智能·算法·matlab·近红外光谱检测
程序员-King.30 分钟前
day166—递归—多边形三角剖分的最低得分(LeetCode-1039)
算法·leetcode·深度优先·动态规划·递归
夏鹏今天学习了吗32 分钟前
【LeetCode热题100(94/100)】下一个排列
算法·leetcode·职场和发展
AI科技星42 分钟前
光的几何起源:从螺旋时空到量子现象的完全统一
开发语言·人工智能·线性代数·算法·机器学习
q_35488851531 小时前
机器学习:Python地铁人流量数据分析与预测系统 基于python地铁数据分析系统+可视化 时间序列预测算法 ✅
大数据·人工智能·python·算法·机器学习·信息可视化·数据分析
永远都不秃头的程序员(互关)2 小时前
【K-Means深度探索(十二)】K-Means项目实战:从数据到决策的完整工作流!
算法·机器学习·kmeans
散峰而望2 小时前
【基础算法】高精度运算深度解析与优化
数据结构·c++·算法·链表·贪心算法·推荐算法
一起养小猫2 小时前
LeetCode100天Day16-跳跃游戏II与H指数
算法·游戏
mit6.8242 小时前
两个有序集合|状态分析
算法
平生不喜凡桃李2 小时前
LeetCode 两数之和/三数之和
算法·leetcode·两数之和·三数之和