给定一个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;
}
}