剑指offer(51)构建乘积数组
题目描述
题目分析
这道题有两种解法,第二种是在第一种的基础上优化了下。
第一种解法:B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]=C[i-1]*D[i-1],也就是我们要求出 C[i] 和 D[i] 就行,相当于牺牲空间复杂度来换时间复杂度。
第二种解法:第一种解法我们发现需要额外的数组,这明显其实本来是没有必要的,因为B数组的计算就是来自于A,不需要多余的C和D数组,那么有什么更好的办法吗?
我们可以可以直接利用B数组并且借助中间变量tmp来实现,具体看代码。
代码
第一种解法:
// 第一种
function multiply(array) {
const C = [],
D = [],
n = array.length;
C[0] = array[0];
for (let i = 1; i < n; i++) {
C[i] = array[i] * C[i - 1];
}
D[n - 1] = array[n - 1];
for (let i = n - 2; i >= 0; i--) {
D[i] = array[i] * D[i + 1];
}
const B = [];
B[0] = D[1];
B[n - 1] = C[n - 2];
for (let i = 1; i < n - 1; i++) {
B[i] = C[i - 1] * D[i + 1];
}
return B;
}
第二种方法:
// 第二种
function multiply2(array) {
const B = [],
len = array.length;
B[0] = 1;
// 计算前i - 1个元素的乘积
for (let i = 1; i < len; i++) {
B[i] = array[i - 1] * B[i - 1];
}
let tmp = 1;
// 计算后N - i个元素的乘积并连接
for (let i = len - 2; i >= 0; i--) {
tmp *= array[i + 1];
B[i] *= tmp;
}
return B;
}
剑指offer(51)构建乘积数组的更多相关文章
- 剑指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 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] * ...
- 剑指 Offer 66. 构建乘积数组 + 思维
剑指 Offer 66. 构建乘积数组 Offer_66 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGarre ...
- 力扣 - 剑指 Offer 66. 构建乘积数组
题目 剑指 Offer 66. 构建乘积数组 思路1 按照一般的思路就是将所有的相乘,然后除以每一位数字就是答案,但是题目要求我们不能使用除法,因此我们会想到每次遍历到每个数字的时候,在遍历一遍数组, ...
- 【剑指Offer】构建乘积数组 解题报告(Python)
[剑指Offer]构建乘积数组 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 【Java】 剑指offer(66) 构建乘积数组
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数组A[0, 1, …, n-1],请构建一个数组B[ ...
- Go语言实现:【剑指offer】构建乘积数组
该题目来源于牛客网<剑指offer>专题. 给定一个数组A[0,1,-,n-1],请构建一个数组B[0,1,-,n-1],其中B中的元素B[i]=A[0] * A[1] * - * A[i ...
- 【剑指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].不 ...
随机推荐
- IntelliJ IDEA 改变默认的签名 Administrator
/** * Created with IntelliJ IDEA. * User: Administrator * Date: 12-8-27 * Time: 下午11:29 * To change ...
- 3D Slicer Reconstruct CT/MRI
3D Slicer Reconstruct CT/MRI 1. Load DCM file of your CT/MRI 2. Go to Volume Rendering, click the ey ...
- 七牛免费SSL证书申请全流程
购买证书 在七牛ssl 首页点击购买 购买限免证书 补全订单信息 免费证书,随意填写,问题不大 购买成功,查看订单详情,获取 TXT 值信息 添加 DNS TXT 验证 根据上一步,查看证书订单详情, ...
- Java 测试连接Oracle数据库是否成功,ojdbc7.jar包下载
需要用到的jar 包: 链接:https://pan.baidu.com/s/1I1pC2f81IvbphZ6tWpVFOg 密码:uq0u 测试结果: package pkg; import jav ...
- js设计模式(六)---命令模式
命令模式算是最简单.优雅的模式之一了,命令模式中的命令指的是一个执行某些特定事情的指令.目的是吧请求发送者和请求接受者解耦, 就像点餐,顾客只需要发送菜单,谁去接收,不用考虑.厨师接收到命令开始做菜, ...
- Linux网络 - 数据包的接收过程(转)
https://segmentfault.com/a/1190000008836467
- php 延迟静态绑定: static关键字
abstract class DomainObject { public static function create() { return new self(); } } class User ex ...
- Compile pam with pam_cracklib.so
pam_cracklib.so is dependent on libcrack.so. Configure command will search libcrack.so. If it didn't ...
- Vue事件总线(eventBus)$on()会多次触发解决办法
项目中使用了事件总线eventBus来进行两个组件间的通信, 使用方法是是建立eventBus.js文件,暴露一个空的Vue实例,如下: import Vue from 'vue'export def ...
- 探究Java中的锁
一.锁的作用和比较 1.Lock接口及其类图 Lock接口:是Java提供的用来控制多个线程访问共享资源的方式. ReentrantLock:Lock的实现类,提供了可重入的加锁语义 ReadWrit ...