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

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

相关推荐
王老师青少年编程3 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao3 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
Coovally AI模型快速验证4 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
可为测控4 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨5 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
BoBoo文睡不醒5 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end6 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹6 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
银河梦想家7 小时前
【Day23 LeetCode】贪心算法题
leetcode·贪心算法
CM莫问7 小时前
python实战(十五)——中文手写体数字图像CNN分类
人工智能·python·深度学习·算法·cnn·图像分类·手写体识别