剑指offer 66. 构建乘积数组(Leetcode 238. Product of Array Except Self)
剑指offer 66. 构建乘积数组
题目:
给定一个数组A[0, 1, ..., n-1],请构建一个数组B[0, 1, ..., n-1],其中B中的元素B[i] = A[0] * A[1] * ... * A[i-1] * A[i +1] ... A[n-1]。不能使用除法。
同leetcode 238
https://leetcode.com/problems/product-of-array-except-self/
分析:
假如可以利用除法,则利用(A[0]*A[1]*...A[n-1])/A[i],但一定要注意A[i]等于 0 的情况!!!
暴力解决需要使用O(n^2)来构建数组B,不够高效。
使用O(n)的时间复杂度来解决本题:
思路比较巧妙,我们知道B[i] = A[0] * A[1] * ... * A[i-1] * A[i+1] ... A[n-1],所以我们将B[i]得到的过程分为两部分:
第一部分:A[0] * A[1] * ... * A[i-1];第二部分: A[i+1] * ... * A[n-1]
我们先“自底向上”计算第一部分,并存储到B中;然后“自顶向下”计算第二部分,并结合B中的第一部分,“自顶向下”更新B中元素。
两个顺序的for循环解决问题。
- void multiply(const vector<double>& array1, vector<double>& array2) {
- int length1 = array1.size();
- int length2 = array2.size();
- if (length1 == length2 && length2 > ) {
- array2[] = ;
- // 计算并存储第一部分
- for (int i = ; i < length1; ++i) {
- array2[i] = array2[i - ] * array1[i - ];
- }
- // 计算第二部分并更新array2
- double temp = ;
- for (int i = length1 - ; i >= ; --i) { // 此时array2[length2 -1]已为正确值
- temp *= array1[i + ];
- array2[i] *= temp;
- }
- }
- }
总结:
本解决方法时间复杂度为O(n)。
本题解决思路巧妙,也是对于问题观察得来的结果。也许想到分成两部分来说不难,尤其是做过一遍之后,但是两个for循环的写法非常值得借鉴,也是对整个清晰思路的完美反映。
剑指offer 66. 构建乘积数组(Leetcode 238. Product of Array Except Self)的更多相关文章
- 剑指 Offer 66. 构建乘积数组 + 思维
剑指 Offer 66. 构建乘积数组 Offer_66 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGarre ...
- 力扣 - 剑指 Offer 66. 构建乘积数组
题目 剑指 Offer 66. 构建乘积数组 思路1 按照一般的思路就是将所有的相乘,然后除以每一位数字就是答案,但是题目要求我们不能使用除法,因此我们会想到每次遍历到每个数字的时候,在遍历一遍数组, ...
- 【Java】 剑指offer(66) 构建乘积数组
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数组A[0, 1, …, n-1],请构建一个数组B[ ...
- 【剑指Offer】构建乘积数组 解题报告(Python)
[剑指Offer]构建乘积数组 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- Go语言实现:【剑指offer】构建乘积数组
该题目来源于牛客网<剑指offer>专题. 给定一个数组A[0,1,-,n-1],请构建一个数组B[0,1,-,n-1],其中B中的元素B[i]=A[0] * A[1] * - * A[i ...
- 剑指Offer 51. 构建乘积数组 (数组)
题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...
- [剑指Offer] 51.构建乘积数组
题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...
- 【剑指offer】构建乘积数组(注意优化空间)
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不能使用除法 ...
- 【剑指offer】构建乘积数组
题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...
随机推荐
- python----四种内置数据结构(dict、list、tuple、set)
1.dict 无序,可更改 2.tuple 有序,不可更改 3.list 有序,可更改(增加,删除) 4.set 无序,可能改 {元素1,元素2,元素3.....}和字典一样都是用大括号定义,不过不同 ...
- Java集合--ArrayList,LinkedList性能分析
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308900.html 第1部分 List概括 先回顾一下List的框架图 (01) List 是一个接口 ...
- mysql sql语句多表合并UNION ALL和UNION
select d1.ID,CAST(d1.ID AS CHAR) AS intId, d1.CODE_TYPE, d1.CODE, d1.CODE_IMG, d1.VALUE from m_dict_ ...
- BZOJ 3931 / Luogu P3171 [CQOI2015]网络吞吐量 (最大流板题)
题面 中文题目,不解释: BZOJ传送门 Luogu传送门 分析 这题建图是显然的,拆点后iii和i′i'i′连容量为吞吐量的边,根据题目要求,111和nnn的吞吐量看作∞\infty∞. 然后用di ...
- 解决每次执行Java等命令时都要重新source /etc/profile后才能执行,否则找不到命令
linux mint 我们通常将环境变量设置在/etc/profile这个文件中,这个文件是全局的. /etc/profile:在登录时,操作系 统定制用户环境时使用的第一个文件 ,此文件为系统的每个 ...
- 怎么学好js
Js给人那种感觉的原因多半是因为它如下的特点: A:本身知识很抽象.晦涩难懂,如:闭包.内置对象.DOM. B:本身内容很多,如函数库.对象库就一大堆. C:混合多种编程思想.它里面不但牵涉面向过程编 ...
- yii 查询垃圾分类接口
public function actionGarbage() { // $param = \Yii::$app->request->post('rubbish', ''); // 接收j ...
- SIGAI深度学习第六集 受限玻尔兹曼机
讲授玻尔兹曼分布.玻尔兹曼机的网络结构.实际应用.训练算法.深度玻尔兹曼机等.受限玻尔兹曼机(RBM)是一种概率型的神经网络.和其他神经网络的区别:神经网络的输出是确定的,而RBM的神经元的输出值是不 ...
- 006_linuxC++之_引用
1. 什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同.申明一个引用的时候,切记要对其进行初始化.引用声明 ...
- flutter布局-1-column
1.mainAxisAlignment:主轴布局方式,column主轴方向是垂直的方向 mainaxis.png 默认值:MainAxisAlignment.start: start ,沿着主轴方 ...