【算法基础】不包含本位置值的累乘的两种解法

给定一个arr,返回不包含本位置的累乘数组,除需要返回的结果数组,额外空间为O(1) 

【升级】给定一个arr,返回不包含本位置的累乘数组,除需要返回的结果数组,额外空间为O(1),不能使用除法  

 * 思路:
     *         计算出arr中0的个数count和非0的累乘值all
     *         如果count为0,则res[i] = all / arr[i]
     *         如果count为1,则当arr[i]值为0位置的res为all,其他res全为0
     *         如果count为其他情况,则res所有位置的值都为0 

源代码 

package com.javakk.ex;

import java.util.Arrays;

/**
 * @Time 2018年8月30日 上午10:35:14
 * @Title { 不包含本位置值的累乘 }
 * @Desc  { 给定一个arr,返回不包含本位置的累乘数组,除需要返回的结果数组,额外空间为O(1) }
 * @Desc  { [升级]给定一个arr,返回不包含本位置的累乘数组,除需要返回的结果数组,额外空间为O(1),不能使用除法 }
 * @Email 92920@sohu.com
 * @Author JavaKK
 */
public class Ex6 {

	public static void main(String[] args) {
		int[] arr = { 1, 3, 4, 5 };
//		int[] res = multiRes(arr);
		int[] res = multiRes2(arr);
		System.out.println(Arrays.toString(res));
	}
	
	/**
	 * 思路:
	 * 		计算出arr中0的个数count和非0的累乘值all
	 * 		如果count为0,则res[i] = all / arr[i]
	 * 		如果count为1,则当arr[i]值为0位置的res为all,其他res全为0
	 * 		如果count为其他情况,则res所有位置的值都为0
	 * @param arr
	 * @return
	 */
//	private static int[] multiRes(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 - 1; i++) {
//				if (arr[i] == 0) {
//					res[i] = all;
//				}
//			}
//		}
//		return res;
//	}
	
	/**
	 * 思路:
	 * 		生成两个和arr一样长的数组la和ra
	 * 		la : arr从左到右的累乘
	 * 		ra : arr从右到左的累乘
	 * 		则res[i] = la[i - 1] * ra[i + 1]
	 * 		题目要求额外空间为O(1),所以要复用res数组
	 * @param arr
	 * @return
	 */
	private static int[] multiRes2(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 : 从左到右的累乘
			res[i] = res[i - 1] * arr[i];
		}
		int temp = 1;
		for (int i = arr.length - 1; i > 0; i--) {
			res[i] = res[i - 1] * temp;
			// temp : 从右到左的累乘
			temp *= arr[i];
		}
		// 边界特殊处理
		res[0] = temp;
		return res;
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值