Day51:构建乘积数组

时间:2022-07-24
本文章向大家介绍Day51:构建乘积数组,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)

具体要求:

时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M

具体实现

思路一:   直接利用暴力法,从题目中可以得知:去除A[i]中的i元素,对于其他元素的乘积就是B[i],时间复杂度O(n^2)。接下来我们分别用java和python将其实现。 1、首先我们用java实现其思路:

import java.util.ArrayList;
public class Solution{
	public int[] multiply(int []A){
		int []B = new int[A.length];
		if(A == null || A.length == 0)
			return null;
		for(int i = 0; i < A.length; i++){
			int tmp = 1;
			for(int j = 0; j < A.length; j++){
				if(j != i){
					tmp *= A[j];
				}
			}
			B[i] = tmp;
		}
		return B;
	}
}

代码效果图如图所示:

2、接着用python将其实现:

class Solution:
	def multiply(self, A):
		B = [1]*len(A)
		for i in range(0, len(A)):
			for j in range(0, len(B)):
				if i != j:
					B[i] *= A[j]
		return B

代码效果图如图所示:

思路二:   B[j]的值可以看作下图的矩阵中每行的积,具体如下图所示:

  由此我们可以看出:先算下三角中的连乘,即先算出B[i]中的前 i 一部分;由于下三角用连乘可以很容易求得。然后倒过来按上三角中的分布规律,把后 ( n-i )部分也乘进去。时间复杂度O(n)。我们分别用java和python将其实现: 1、首先用java将其实现:

import java.util.ArrayList;
public class Solution{
	public int[] multiply(int[] A){
		if(A == null || A.length == 0)
			return null;
		int len = A.length;
		int[] B = new int[len];
		B[0] = 1;
		for(int i = 1; i <= len - 1; i++){
			B[i] = B[i - 1]* A[i - 1];
		}
		int tmp  = 1;
		for(int i = len - 2; i >= 0; i--){
			tmp *= A[i + 1];
			B[i] *= tmp; 
		}
		return B;
	}
}

代码效果图如图所示:

2、接下来用Python实现:

class Solution:
	def multiply(self, A):
		n = len(A)
		B = [1] * n
		for i in range(1, n):
			B[i] = B[i - 1] * A[i - 1]
		tmp = 1
		for j in range(n - 2, -1, -1):
			tmp *= A[j + 1]
			B[j] *= tmp
		return B

代码效果图如图所示:

总结

  本题是主要考察数组中构建乘积数组,本题比较直接,拿到题后给我们最为直观、暴力的做法就是通过两次循环,除了A的第i个数,剩下的元素直接乘积即可,但是这种做法的最大问题就是时间复杂度过高,虽然我们的编译器可以通过。当然牛客网也可通过。于是,我们诞生了第二种做法,那就是我们将B[i]的值看做矩阵中每行的乘积,然后通过找规律将其实现。这种做法大大降低了时间复杂度,并且这两种方法我们都用java和python两种语言将其实现。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!

参考文献

[1] Heisenberg_SF [2] 小晓酱手记