数组和矩阵问题:不包含本位置值的累乘数组
【题目】
给定一个整型数组 arr, 返回不包含本位置值的累乘数组。例如, arr = [2, 3, 1, 4], 返回 [12, 8, 24, 6], 即除自己外,其他位置上的累乘。
【要求】
时间复杂度为 O(N), 额外空间复杂度为 O(1), 不改变原数组。
【难度】
一星
【解答】
该题可以使用除法实现,结果数组记为 res,所有非零数的累乘积为 all。存在三种可能:
- 如果数组中不含 0,则设置 res[i] = all / arr[i].
- 如果数组中有1个0, 对唯一的 arr[i] == 0 的位置令 res[i] = all, 其他位置上的值都为 0.
- 如果数组中多于1个0, 则 res 的所有位置上的值都为 0.
具体实现过程请参考如下代码中 product 方法
1 import java.util.Arrays; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 int[] arr1 = {2,3,1,4}; 7 System.out.println(Arrays.toString(new Main().product(arr1)));//[12, 8, 24, 6] 8 9 int[] arr2 = {2,3,0,4}; 10 System.out.println(Arrays.toString(new Main().product(arr2)));//[0, 0, 24, 0] 11 12 int[] arr3 = {2,0,0,4}; 13 System.out.println(Arrays.toString(new Main().product(arr3)));//[0, 0, 0, 0] 14 } 15 16 public int[] product(int[] arr){ 17 if(arr == null || arr.length < 2) return arr; 18 int len = arr.length; 19 int[] res = new int[len]; 20 int all = 1; 21 int count = 0; 22 int zeroIndex = -1; 23 for(int i = 0; i < len; i++){ 24 if(arr[i] == 0){ 25 if(++count > 1){//如果数组中多于1个0, 则 res 的所有位置上的值都为 0 26 return res; 27 } 28 zeroIndex = i; 29 }else{ //all 为所有非零数的累乘积 30 all *= arr[i]; 31 } 32 } 33 34 if(count == 0){//如果数组中不含 0,则设置 res[i] = all / arr[i] 35 for(int i = 0; i < len; i++){ 36 res[i] = all / arr[i]; 37 } 38 }else{//如果数组中有1个0, 对唯一的 arr[i] == 0 的位置令 res[i] = all, 其他位置上的值都为 0. 39 res[zeroIndex] = all; 40 } 41 42 return res; 43 } 44 45 }