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

news/2025/1/15 23:03:50/

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

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

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—力扣专栏,每日更新!

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


http://www.ppmy.cn/news/1073819.html

相关文章

FPGA优质开源项目 – UDP万兆光纤以太网通信

本文开源一个FPGA项目&#xff1a;UDP万兆光通信。该项目实现了万兆光纤以太网数据回环传输功能。Vivado工程代码结构和之前开源的《UDP RGMII千兆以太网》类似&#xff0c;只不过万兆以太网是调用了Xilinx的10G Ethernet Subsystem IP核实现。 下面围绕该IP核的使用、用户接口…

“来了,就是深圳人”!深圳公积金的数字化之路

“来了&#xff0c;就是深圳人”&#xff0c;是深圳对打工人的诚意。 过去 12 年&#xff0c;深圳凭借科创和互联网发展浪潮&#xff0c;吸引了一波又一波追梦的年轻人。这期间&#xff0c;移动互联网、“互联网”已经深入民众生活的方方面面&#xff0c;购物、娱乐、理财等在手…

【状压+概率DP】CF678 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 首先&#xff0c;n < 18&#xff0c;应当想到状压 很明显&#xff0c;这里可以使用状压DP 设 dp[s][i] 表示&#xff0c;现在选的方案为 s &#xff0c;且我是 i 的最终胜利的概率是多少 重要的是转移 这是…

c++学习之vector的实现

在学习实现vector之前我们会看到对于库中的vector的实现&#xff0c;这里并非使用在学习string那样的定义方式&#xff0c;而是利用迭代器&#xff0c;也就是指针来实现的&#xff0c;这在功能的实现时极大的方便了我们。 那么我们就模仿库这样的方式实现我们呢经常会用到的一些…

Django静态文件媒体文件文件上传

文章目录 一、静态文件和媒体文件1.在django中使用静态文件实践2.在django中使用媒体文件 二、文件上传单文件上传实践多文件上传 一、静态文件和媒体文件 媒体文件: 用户上传的文件&#xff0c;叫做media 静态文件:存放在服务器的css,js,image,font等 叫做static1.在django中…

docker好难用啊!为啥说它移植性好?

刚刚接触docker&#xff0c;真的好麻烦啊&#xff0c;不明白为什么要选择docker&#xff0c;我都搞了两天还在搭环境&#xff0c;又告诉我Windows版本过低不适配docker&#xff0c;转而在Ubuntu里装docker&#xff0c;然后MySQL、php、Nginx又得重新装一遍。。。好麻烦啊 1 用…

【Spring Data JPA】JPA 常用查询函数

文章目录 前言函数查询表格 前言 函数查询的表格参考了官网的 2.7.3 版本的文档&#xff0c;JPA 的这种函数式查询方法改动不大&#xff0c;如果想知道更多的复杂查询&#xff0c;可以参考这篇文章 【Spring Data JPA】基于 JpaRepository 增删改查 官方文档地址 Spring Data…

spring中LocalDateTime 转成字符串的时候注意事项

ApiOperation("查询课程发布信息") ResponseBody GetMapping("/r/coursepublish/{courseId}") public CoursePublish getCoursepublish(PathVariable("courseId") Long courseId) { CoursePublish coursePublish coursePublishService.getC…