【Offer】[66] 【构建乘积数组】
2024-09-21 02:11:44
题目描述
给定一个数组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[i]=A[0]xA[]...xA[i-1]xA[i+1]...x A[n-1]看成A[0]xA[1]x...xA[i-1]和A[i+1]...xA[n -2]xA[n-1 ]两部分的乘积。因此,
数组B可以用一个矩阵来创建。在图中,B[i]为矩阵中第i行所有元素的乘积。

定义C[i]=A[0]xA[1]...xA[i-1], D[i]=A[i+1]x...xA[n-2]xA[n-1]。
C[i]可以用自上而下的顺序计算出来,即C[i]=C[i-1]xA[i-1]。类似的,D[i]
也可以用自下而上的顺序计算出来,即D[i]=D[i+1]xA[i+1].
测试用例
- 功能测试:输入数组包含正数、负数、一个0、多个0。
- 边界值测试:输入数组的长度为0。
Java代码
public class Offer066 {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static int[] multiply(int[] A) {
return Solution1(A);
}
private static int[] Solution1(int[] A) {
if(A==null || A.length<2)
return null;
int[] B=new int[A.length];
B[0]=1;
for(int i=1;i<A.length;i++)
B[i]=B[i-1]*A[i-1];
int temp=1;
for(int i=A.length-2;i>=0;i--){
temp*=A[i+1];
B[i]*=temp;
}
return B;
}
private static void test1() {
}
private static void test2() {
}
private static void test3() {
}
}
代码链接
最新文章
- UVA - 11584 Partitioning by Palindromes[序列DP]
- 使用Swift操作NSDate类型基础
- Python迁移MySQL数据到MongoDB脚本
- (C#基础) byte[] 之初始化, 赋值,转换。
- query specified join fetching, but the owner of the fetched association was not present in the select list
- apache开源项目--HydraBase
- @property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的
- Python3学习之二Django搭建
- MSSQL 常用内置函数
- 17 个 tar 命令实用示例【转】
- 排序算法入门之快速排序(java实现)
- 跨平台技术实践案例: 用 reactxp 重写墨刀的移动端
- POJ1192最优连通子串----树形dp
- zabbix添加IIS网站计数器(并发连接数)详解
- 2018-2019-2 20165315《网络对抗技术》Exp2 后门原理与实践
- js string和number
- 初识thinkphp(3)
- CentOS中vsftpd的主动和被动方式
- 第一篇markdown笔记
- Art of Android Develop. Activity的生命周期和启动模式。
热门文章
- Cobbler 自动安装CentOS7
- 安装CUDA9.0及对应版本的tensorflow-gpu详细过程(Windows server 2012R2版本也可以)
- GDOI#348大陆争霸[SDOI2010]最短路有限制条件
- 安装yarn实况
- coursera课程《how to learning 怎么学习》 总结
- 夯实Java基础(十七)——注解(Annotation)
- threejs 学习之
- 表结构查询 Sql
- Flutter学习笔记(21)--TextField文本框组件和Card卡片组件
- (四十二)c#Winform自定义控件-进度条扩展