Day51:构建乘积数组
剑指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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体实现
思路一: 直接利用暴力法,从题目中可以得知:去除A[i]中的i元素,对于其他元素的乘积就是B[i],时间复杂度O(n^2)。接下来我们分别用java和python将其实现。 1、首先我们用java实现其思路:
import java.util.ArrayList;
public class Solution{
public int[] multiply(int []A){
int []B = new int[A.length];
if(A == null || A.length == 0)
return null;
for(int i = 0; i < A.length; i++){
int tmp = 1;
for(int j = 0; j < A.length; j++){
if(j != i){
tmp *= A[j];
}
}
B[i] = tmp;
}
return B;
}
}
代码效果图如图所示:
2、接着用python将其实现:
class Solution:
def multiply(self, A):
B = [1]*len(A)
for i in range(0, len(A)):
for j in range(0, len(B)):
if i != j:
B[i] *= A[j]
return B
代码效果图如图所示:
思路二: B[j]的值可以看作下图的矩阵中每行的积,具体如下图所示:
由此我们可以看出:先算下三角中的连乘,即先算出B[i]中的前 i 一部分;由于下三角用连乘可以很容易求得。然后倒过来按上三角中的分布规律,把后 ( n-i )部分也乘进去。时间复杂度O(n)。我们分别用java和python将其实现: 1、首先用java将其实现:
import java.util.ArrayList;
public class Solution{
public int[] multiply(int[] A){
if(A == null || A.length == 0)
return null;
int len = A.length;
int[] B = new int[len];
B[0] = 1;
for(int i = 1; i <= len - 1; i++){
B[i] = B[i - 1]* A[i - 1];
}
int tmp = 1;
for(int i = len - 2; i >= 0; i--){
tmp *= A[i + 1];
B[i] *= tmp;
}
return B;
}
}
代码效果图如图所示:
2、接下来用Python实现:
class Solution:
def multiply(self, A):
n = len(A)
B = [1] * n
for i in range(1, n):
B[i] = B[i - 1] * A[i - 1]
tmp = 1
for j in range(n - 2, -1, -1):
tmp *= A[j + 1]
B[j] *= tmp
return B
代码效果图如图所示:
总结
本题是主要考察数组中构建乘积数组,本题比较直接,拿到题后给我们最为直观、暴力的做法就是通过两次循环,除了A的第i个数,剩下的元素直接乘积即可,但是这种做法的最大问题就是时间复杂度过高,虽然我们的编译器可以通过。当然牛客网也可通过。于是,我们诞生了第二种做法,那就是我们将B[i]的值看做矩阵中每行的乘积,然后通过找规律将其实现。这种做法大大降低了时间复杂度,并且这两种方法我们都用java和python两种语言将其实现。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!
参考文献
[1] Heisenberg_SF [2] 小晓酱手记
- 洛谷P1339 [USACO09OCT]热浪Heat Wave(最短路)
- excel导出类
- 我的HTML总结之常用基础便签
- php性能监测模块XHProf
- php dirname(__FILE__) 获取当前文件的绝对路径
- 洛谷P2939 [USACO09FEB]改造路Revamping Trails(最短路)
- 微信公众平台开发接口PHP SDK完整版
- 我的HTML总结之HTML发展史
- BZOJ 4152: [AMPPZ2014]The Captain(最短路)
- js获取div编辑框,textarea,input text的光标位置,兼容FF和IE
- BZOJ 4289: PA2012 Tax(最短路)
- php QR Code二维码生成类
- BZOJ 3714: [PA2014]Kuglarz(最小生成树)
- 我的HTML总结之表单
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL数据库与JDBC编程
- 自动删除QQ空间指定好友的留言
- 在Ubuntu 18.04中安装VMware工具
- 微信小程序下拉刷新功能
- 详解Linux Screen让程序保持后台运行
- Python Des加密与解密实现软件注册码、机器码
- Excel VBA 在保留原单元格数据的情况下,将计算的百分比加在后面
- 入门级别的面试题——LeetCode题目19:删除链表的倒数第N个节点
- python做web接口测试零散笔记--1
- 要一遍做对——LeetCode题目20:有效的括号
- 双指针算法练习(一)
- 一般是面试的热身题——LeetCode题目21:合并两个有序链表
- LeetCode题目22:括号生成
- OpenGL ES 3.0 | 着色器编译器
- LeetCode题目23:合并K个排序链表