题目描述

给定一个数组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]。不能使用除法。

分析:注意,题目要求不能使用除法!

我们发现如果采取暴力的操作的话,会有很多的重复性操作,我们可以采用数组记录来减少重复性的操作

采用一个二维dp数组来记录乘积和,dp[i][j]代表索引i到索引j的乘积,计算过后可以记录下来,这样后面需要用的时候就不再需要去计算,可以直接用,这个就是所谓的备忘录法

先对dp数组进行初始化

dp[0][0]=a[0]

dp[0][i]=dp[0][i-1]*a[i],i>=1,i<n

dp[n-1][n-1]=a[n-1]

dp[i][n-1]=dp[i+1][n-1]*a[i]

状态转移公式:

当i==0时,b[i]=dp[1][n-1],单独处理首部

当i==n-1时,b[i]=dp[0][i-1],单独处理尾部

i>0&&i<n-1时,b[i]=dp[0][i-1]*dp[i+1][n-1]

时间复杂度:O(N)

空间复杂度:O(N*N)

class Solution
{
public:
vector<int> multiply(const vector<int>& a)
{
int n=a.size();
int dp[n][n];//dp[i][j]:索引i到索引j的元素乘积
memset(dp,0,sizeof(0));
vector<int> b(n,0); //初始化
dp[0][0]=a[0];
for(int i=1; i<n; i++)
{
dp[0][i]=dp[0][i-1]*a[i];
}
dp[n-1][n-1]=a[n-1];
for(int i=n-2; i>=0; i--)
{
dp[i][n-1]=dp[i+1][n-1]*a[i];
} //需要单独处理首部和尾部
for(int i=0; i<n; i++)
{
if(i==0)
{
b[i]=dp[1][n-1];
}
else if(i==n-1)
{
b[i]=dp[0][i-1];
}
else
{
b[i]=dp[0][i-1]*dp[i+1][n-1];
}
}
return b;
}
};

【剑指offer】构建乘积数组的更多相关文章

  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]. ...

  2. 剑指Offer-51.构建乘积数组(C++/Java)

    题目: 给定一个数组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].不能 ...

  3. 剑指offer52 构建乘积数组

    这个题的错误和c++ primier中名字的作用域例子相似.只是这里将int换成了vecto<int>这种形式. class Solution { public: vector<in ...

  4. 剑指offer:调整数组顺序使奇数位于偶数前面

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...

  5. 《剑指offer》 调整数组顺序使得奇数在偶数前面

    本题来自<剑指offer> 调整数组顺序使得奇数在偶数前面 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分, ...

  6. 《剑指offer》旋转数组中的最小数字

    本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...

  7. 剑指Offer:把数组排成最小的数【45】

    剑指Offer:把数组排成最小的数[45] 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如,输入数组是{3.32.321},则打印出来的这3 ...

  8. 剑指Offer:调整数组顺序使奇数位于偶数前面【21】

    剑指Offer:调整数组顺序使奇数位于偶数前面[21] 题目描述 输入一个整形数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解题分析 使用插 ...

  9. 剑指Offer:旋转数组的最小数字【11】

    剑指Offer:旋转数组的最小数字[11] 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4 ...

  10. ⛅剑指 Offer 11. 旋转数组的最小数字

    20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...

随机推荐

  1. vue+element拖动排序功能

    项目中老大心血来潮设计了一可以拖动达到排序的功能,感觉没什么用,但是没办法,实现吧! 这功能肯定不会手撸了,直接上插件 使用Sortable.js,对vue不友好,拖拽有时候乱跳;改用vuedragg ...

  2. Git恢复删除的分支

    1.使用 git reflog 命令查看显示整个本地仓储的commit,包括所有branch的commit,甚至包括已经撤销的commit. 2.找到我们想要恢复的分支 ,可以看到我们当时commit ...

  3. Using hints for Postgresql

    本文转自:http://pghintplan.osdn.jp/pg_hint_plan.html pg_hint_plan 1.1 pg_hint_plan Name Synopsis Descrip ...

  4. XGBoost 引入 - 提升树

    认识提升树 这个boosting 跟 Adaboost 不同. Adaboost 是通过上一轮的误差率来动态给定一下轮样本不同的权重来学习不同的模型. 现在的方式, 更多是基于残差 的方式来训练. 一 ...

  5. xadmin引入django-rest-framework

    一.安装: pip install djangorestframework 安装djangorestframework库 https://github.com/encode/django-rest-f ...

  6. Pytorch: parameters(),children(),modules(),named_*区别

    nn.Module vs nn.functional 前者会保存权重等信息,后者只是做运算 parameters() 返回可训练参数 nn.ModuleList vs. nn.ParameterLis ...

  7. CentOS6.10部署的Tomcat8.5启动后,浏览器访问不到的解决方法

    解决过程如下: 一.关闭 selinux 和 iptables 防火墙 二.查看 tomcat 是否在运行 ps aux |grep tomcat 三.查看端口情况 lsof -i:8080 查看后都 ...

  8. 解决tomcat出现乱码问题---韦大仙

    1. 改这两个文件 URIEncoding="UTF-8" 2.然后重启idea

  9. 【java】ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

    如果是负载均衡,则 jdbc.url=jdbc:oracle:thin:@(description=(address_list= (address=(host=XX.XXX.X.XX) (protoc ...

  10. 无旋treap大法好

    无旋Treap大法好 原理? 是一棵二叉查找树: 一个节点左子树权值都比他小,右子树权值都比他大 所以可以维护序列(以位置为权值),或数值(以数值为权值) 是一个堆: 每个节点除了上述提到的权值外,还 ...