码迷,mamicode.com
首页 > 编程语言 > 详细

lintcode 容易题:Product of Array Exclude Itself 数组剔除元素后的乘积

时间:2015-10-16 20:50:48      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

题目:

给定一个整数数组A。

定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法。

样例

给出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;
    }
}
View Code

总耗时: 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
View Code

总耗时: 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;
    }
}
View Code

总耗时: 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 
View Code

总耗时: 475 ms

上面链接中还给只用定义一个数组的,中间定义一个变量,慢慢增加的。

 

 

 

lintcode 容易题:Product of Array Exclude Itself 数组剔除元素后的乘积

标签:

原文地址:http://www.cnblogs.com/theskulls/p/4886232.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!