#数据结构与算法学习笔记#剑指Offer49:构建乘积数组(Java、C/C++)

234 篇文章 1 订阅
80 篇文章 0 订阅

2019.2.18     《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门​​​​​​​

既然规定了不能用除法,说明这道题肯定要取巧做。我们可以考虑一个矩阵Bm(n\times n),矩阵每一个对应一个乘积项,构建数组B的每一个元素相当于矩阵Bm每一行所有元素连乘的乘积。从而构建的矩阵形式如下:

例如数组B的第i个元素为矩阵Bm第i行所有元素的乘积(第i列元素用1代替)——B[i]=A[0]*A[1]*...*A[i-1]*1*A[i+1]*...*A[n-1]。

观察可以发现矩阵存在规律的上下三角,上下三角乘积和每一项以前一项为基础逐次递增,可以很容易通过复杂度为o(n)的两个for循环分别求得两个上下三角数组,再将两个数组对应相乘即可求出最终数组B。


题目描述

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


Java实现:

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

public class Multiply_50 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] input = {1, 2, 3};
		int[] result = multiply(input);
		for(int i = 0; i < result.length; i++) {
			System.out.print(result[i] + " ");
		}
	}
	
    public static int[] multiply(int[] A) {
    	if(A == null || A.length == 0)return null;
    	int length = A.length;
    	
    	int[] resultup = new int[length];		//矩阵上三角
    	int[] resultdown = new int[length];		//矩阵下三角
    	
    	//计算上三角
    	resultup[length - 1] = 1;
    	int num = length - 1;
    	for(int i = length - 2; i >= 0; i--) {
    		resultup[i] = resultup[i + 1] * A[num--];
    	}
    	
    	//计算下三角
    	resultdown[0] = 1;
    	num = 0;
    	for(int i = 1; i < length; i++) {
    		resultdown[i] = resultdown[i - 1] * A[num++];
    	}
    	
    	//合并矩阵
    	for(int i = 0; i < length; i++) {
    		resultup[i] = resultup[i] * resultdown[i];
    	}
    	
    	return resultup;
    }
}

C++实现示例:

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {     
         
    int n = A.size();
    vector<int> B0(n, 1);
    vector<int> B1(n, 1);
 
    for (int i = 1; i < n;++i)
    {
        B0[i] = B0[i - 1] * A[i - 1];
    }
    for (int i = n - 2; i >= 0;--i)
    {
        B1[i] = B1[i + 1] * A[i + 1];
    }
 
    vector<int> B(n, 1);
    for (int i = 0; i < n;++i)
    {
        B[i] = B0[i] * B1[i];
    }
 
    return B;
         
         
    }
};

#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值