zoukankan      html  css  js  c++  java
  • [Java]剑指offer:构建乘积数组

    题目描述

    给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。
    (注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
     
    思路
     
          最容易想到的就是暴力法,依次求出每个B[i],但是这样的时间复杂度为O(n^2),效率太低了。
          既然暴力法效率太低,那就看看能不能找出B[i]之间的关系来提高效率。
     
            

    由上图可以发现

    B[i]的左半部分(红色部分)和B[i-1]有关,将红色部分乘积和看成C[i],则有C[i] = C[i-1]*A[i-1]
    B[i]的右半部分(紫色部分)和B[i+1]有关,可以使用一个temp代表B[i]的右半部分,每次temp*A[i+1]
     
    因此我们可以先从0遍历到n-1,计算出B[i]的左半部分。然后将左半部分与代表其有半部分的temp相乘,即可得到B[i]。
     1 import java.util.ArrayList;
     2 public class Solution {
     3     public int[] multiply(int[] A) {
     4         
     5         if(A.length==0||A.length<2){
     6             return null;
     7         }
     8         
     9         int[] B = new int[A.length];
    10         B[0] = 1;
    11         for(int i=1;i<B.length;i++){
    12             B[i] = B[i-1]*A[i-1];
    13         }
    14         int temp = 1;
    15         for(int i = A.length-2;i>=0;i--){
    16             temp *= A[i+1];
    17             B[i] *= temp;
    18         }
    19      
    20         return B;
    21     }
    22 }

    总结

    数组间的关系通过画图更容易找出关系

  • 相关阅读:
    洛谷
    洛谷
    模板
    模板
    模板
    模板
    模板
    洛谷
    洛谷
    模板
  • 原文地址:https://www.cnblogs.com/blzm742624643/p/13369174.html
Copyright © 2011-2022 走看看