题目:
给定一个整数数组A。
定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法。
样例
View Code
View Code
View Code
View Code
给出A=[1, 2, 3],返回 B为[6, 3, 2]
解题:
leftb计算左侧的连乘值,每次增加一个成绩,rightb计算右侧的连乘值,每次重新计算,时间复杂度O(N2),下面写的程序,自我感觉很差的。。。
Java程序:
public class Solution { /** * @param A: Given an integers array A * @return: A Long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1] */ public ArrayList<Long> productExcludeItself(ArrayList<Integer> A) { // write your code ArrayList<Long> B = new ArrayList<Long>(); long leftb = 1; long rightb = 1; for(int i = 0 ;i<A.size();i++){ if(i==0){ leftb = 1; }else leftb = leftb * A.get(i-1); for(int j=i+1;j<A.size();j++){ rightb = rightb * A.get(j); } long bi = leftb * rightb; B.add(bi); rightb = 1; } return B; } }
总耗时: 1602 ms
Python程序:
class Solution: """ @param A: Given an integers array A @return: An integer array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1] """ def productExcludeItself(self, A): # write your code here leftb = 1 rightb = 1 B = [] for i in range(len(A)): if i==0: leftb = 1 else: leftb *= A[i-1] rightb = 1 for j in range((i+1),len(A)): rightb *= A[j] bi = leftb * rightb B.append(bi) return B
总耗时: 582 ms
左右分治,这个效率很高 ,减少了重复计算rightb。result[i] = left[i] * right[i] ,left[i] = A[0]*A[1]***A[i-1],right[i] = A[i+1]*A[i+2]***A[len(A)-1]。将最后的乘积分为两部分求解,首先求得左半部分的值,然后求得右半部分的值。最后将左右两半部分乘起来即为解。
时间复杂度 O(n). 使用了左右两半部分辅助空间,空间复杂度 O(2n).
注意:初值left[0] = 1.right[A.size()-1]=1
Java程序:
public class Solution { /** * @param A: Given an integers array A * @return: A Long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1] */ public ArrayList<Long> productExcludeItself(ArrayList<Integer> A) { // write your code ArrayList<Long> B = new ArrayList<Long>(); if(A==null || A.size()==1){ long bi = 1; B.add(bi); return B; } long[] left = new long[A.size()]; long[] right = new long[A.size()]; left[0] = 1; for(int i=1;i<A.size();i++){ left[i] = left[i-1] * A.get(i-1); } right[A.size()-1] = 1; for(int i=A.size()-2;i>=0;i--){ right[i] = right[i+1] * A.get(i+1); } for(int i=0;i<A.size();i++){ long res = right[i] * left[i]; B.add(res); } return B; } }
总耗时: 1873 ms
Python程序:
class Solution: """ @param A: Given an integers array A @return: An integer array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1] """ def productExcludeItself(self, A): # write your code here if A==None or len(A)<=1: B = [1] return B Alen = len(A) left = [1]*Alen right = [1]*Alen B = [] for i in range(1,Alen): left[i] = left[i-1] * A[i-1] for i in range(Alen-2,-1,-1): right[i] = right[i+1] * A[i+1] for i in range(Alen): res = right[i] * left[i] B.append(res) return B
总耗时: 475 ms
上面链接中还给只用定义一个数组的,中间定义一个变量,慢慢增加的。