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

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

相关推荐
轻颂呀30 分钟前
约瑟夫环问题
算法
科技大视界2 小时前
投资AI项目,传统尽调不够用了——李章虎律师拆解算法、数据、算力三大雷区
人工智能·算法·数据挖掘
郝学胜-神的一滴2 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe3 小时前
算法滑动窗口
数据结构·算法
怪兽学LLM3 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:分治递归思路详解
算法·leetcode·职场和发展
可编程芯片开发3 小时前
基于PI控制的三相整流器控制系统的simulink建模与仿真,包含超级电容充电和电机
算法
酿情师3 小时前
区块链共识算法深度拆解:PoW、PoS、PBFT、Raft 原理解析
算法·区块链·共识算法
hansang_IR3 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法
退休倒计时4 小时前
【每日一题】LeetCode 39. 组合总和 TypeScript
算法·leetcode·typescript
不是az4 小时前
力控相关知识点
算法·机器学习·最小二乘法