数组和矩阵问题:不包含本位置值的累乘数组

题目

  给定一个整型数组 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 }

 

posted @ 2019-03-13 20:11  米突小搞羊  阅读(284)  评论(0编辑  收藏  举报