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

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

相关推荐
liliangcsdn1 天前
因子分析指标概念与示例
算法·机器学习
SupL!1 天前
LoftQ原理
算法
Navigator_Z1 天前
LeetCode //C - 1240. Tiling a Rectangle with the Fewest Squares
c语言·算法·leetcode
稻米哟1 天前
力扣100——双指针
算法·leetcode
明志数科1 天前
具身智能真机采集工程实践:5类高频失效模式与规避清单
人工智能·算法·机器学习
CSDN_RTKLIB1 天前
空间哈希与拓扑缓存
算法
大熊背1 天前
IspPipeline色相旋转模块实现
人工智能·算法·计算机视觉
爱学习的小白柏1 天前
同城双活的核心不是双活,是逼着数据别出机房
大数据·人工智能·算法·langchain·ai编程
鹿角片ljp1 天前
LeetCode 31:下一个排列|右找小,右找大,交换,右反转
java·数据结构·算法
橘子汽水1681 天前
Leetcode 198,118打家劫舍,杨辉三角
算法·leetcode