[算法]不包含本位置值的累乘数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]不包含本位置值的累乘数组相关的知识,希望对你有一定的参考价值。

题目:

给定一个整型数组,返回不包含本位置的累乘数组。

例如:arr=[2,3,1,4],返回[12,8,24,6],即除自己外,其他位置的类乘。

要求:

1.时间复杂度为O(N).

2.除需要返回的结果数组之外,额外空间复杂度为O(1).

使用除法:

结果数组记为res,所有数的乘积记为all。如果数组中不含0,则设置res[i]=all/arr[i]。如果数组中有一个0,对唯一的arr[i]==0的位置令res[i]=all,其他位置都是0。如果数组中0的数量大于1,那么res所有位置上的值都是0。

	public static int[] product1(int[] arr) {
		if (arr == null || arr.length < 2) {
			return null;
		}
		int count = 0;
		int all = 1;
		for (int i = 0; i != arr.length; i++) {
			if (arr[i] != 0) {
				all *= arr[i];
			} else {
				count++;
			}
		}
		int[] res = new int[arr.length];
		if (count == 0) {
			for (int i = 0; i != arr.length; i++) {
				res[i] = all / arr[i];
			}
		}
		if (count == 1) {
			for (int i = 0; i != arr.length; i++) {
				if (arr[i] == 0) {
					res[i] = all;
				}
			}
		}
		return res;
	}

不使用除法:

1.生成两个长度和arr一样的新数组lr[]和rl[],lr[i]=arr[0…i],rl[i]=arr[i…N-1]。

2.res[i]=lr[i-1]*rl[i+1]

3.res[0]=rl[1],res[N-1]=lr[N-2]

这里又额外使用了两个数组,可以通过res数组复用的方式省略掉这两个数组,先把res数组作为辅助计算的数组,然后把res调整成结果数组返回。

	public static int[] product2(int[] arr) {
		if (arr == null || arr.length < 2) {
			return null;
		}
		int[] res = new int[arr.length];
		res[0] = arr[0];
		for (int i = 1; i < arr.length; i++) {
			res[i] = res[i - 1] * arr[i];
		}
		int tmp = 1;
		for (int i = arr.length - 1; i > 0; i--) {
			res[i] = res[i - 1] * tmp;
			tmp *= arr[i];
		}
		res[0] = tmp;
		return res;
	

以上是关于[算法]不包含本位置值的累乘数组的主要内容,如果未能解决你的问题,请参考以下文章

算法总结之 不包含本位置的累乘数组

算法数组与矩阵模块不包含本位置的累乘数组值(含不用除法的方法)

五种C程序计算阶乘方法 c语言实现1到n的阶乘1*2*3*.....*n的累乘计算,使用不同方法实现,五种计算阶乘的方法

hdu 2011 多项式求和

论文笔记:Deep Residual Learning

Pandas:用于在 DataFrame 中设置值的三元条件运算符