题目描述

给定一个数组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. Java自学-I/O 字符流

    Java的字符流 Reader Writer Reader字符输入流 Writer字符输出流 专门用于字符的形式读取和写入数据 步骤 1 : 使用字符流读取文件 FileReader 是Reader子 ...

  2. Spring Cloud Gateway转发Spring WebSocket

    Spring Cloud Gateway转发Spring WebSocket 源码:https://github.com/naah69/SpringCloud-Gateway-WebSocket-De ...

  3. 点击Button按钮实现页面跳转

    1.首先我们新建一个带有button按钮的页面 <button type="submit" class="form-contrpl">注册</ ...

  4. Angular4项目运行时URL自动加#方法

    import {HashLocationStrategy , LocationStrategy} from '@angular/common'; @NgModule({   declarations: ...

  5. Caml 多表关联查询

    using (SPSite site = new SPSite(SiteUrl)) { using (SPWeb web = site.RootWeb) { SPQuery query = new S ...

  6. Windows 获取进程ID

    DWORD GetProcessID(const char *ProcessName) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY ...

  7. webview学习

    Android中WebView使用6,js调java实现播放视频 https://blog.csdn.net/zhaihaohao1/article/details/77993890 android ...

  8. 建议各位亲使用LocalDateTime而不使用Date哦

    在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到: 为什么需要LocalDate.Loca ...

  9. Linux服务管理之SSH

    Linux服务SSH ssh服务: 管理服务器的方式:                      本地管理类   (安装系统,故障修复)           SHH远程连接方式            ...

  10. IDEA 设置(中文乱码、svn、热部署、ideolog 、Jrebel )

    目录 console中文乱码 idea 多个工程分别设置svn idea svn忽略版本控制 idea svn客户端 ideolog 插件配置 idea 热部署 Jrebel 插件激活和使用 # I ...