剑指offer 构建乘积数组

本文介绍了一种高效的矩阵乘法算法,通过构建矩阵并分解大问题为小问题,利用递推关系求解C[i]和D[i],进而得到矩阵的第i行所有元素的乘积B[i]。提供了C++和Java两种语言的实现代码。

https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46?tpId=13&tqId=11204&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

图片

思路:如上图构建一个矩阵,可以看到B[i]即为矩阵的第i行所有元素的乘积。

 定义C[i] = A[0] * A[1] *........*A[I-1],  D[I] = A[I +1] * A[I + 2] *.......A[n-2]*A[n-1](拆分项,将大问题分解为小问题)

现在问题就是求C[i] 和 D[i] 了, 发现子问题还可以被分解,子问题存在递推的关系)

可得C[i] = C[i-1]* A[i-1]     D[I] = D[I + 1] * A[I + 1] 而B[i] = C[i] * D[i]

 


class Solution {
public:
    vector<int> multiply(const vector<int>& A) 
	{
		vector<int>res;
		int len = A.size();
		if(len == 0)
			return res;
		int * C = new int[len  + 1];
		int * D = new int[len + 1];
		//初始化C[i]
		C[0] = 1;
		C[1] = A[0];
		for(int i = 2; i < len; i++)//求C[i]
			C[i] = C[i - 1] * A[i - 1];

		//同上C[i];
		D[len - 1] = 1;
		D[len - 2] = A[len - 1];

		for(int i = len - 3; i >= 0; i--)
		{
			D[i] = D[i + 1] * A[i + 1];
		}
		for(int i = 0; i < len ; i++)
		{
			res.push_back (C[i] * D[i]);
		}
		delete []C;
		delete []D;
		return res;
    
    }
};

JAVA版本:

import java.util.ArrayList;
public class Solution {
   
    public int[] multiply(int[] A) {
    	
    	int n = A.length;
    	int []res = new int[n];
    	if(n <= 0)
    		return res;
    	
    	int []C = new int[n + 1];
    	int []D = new int[n + 1];
    	
    	C[0] = 1;
    	C[1] = A[0];
    	
    	for(int i = 2; i < n; i++)
    		C[i] = C[i - 1] * A[i - 1];
    	D[n - 1] = 1;
    	
    	for(int i = n - 2; i >= 0; i--) {
    		D[i] = D[i + 1] * A[i + 1];
    	}
    	
    	for(int i = 0; i < n; i++)
    		res[i] = C[i] * D[i];
    	
    	return res;
    	
    }
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值