• lintcode :数组剔除元素后的乘积


    题目:

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

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

  • 相关阅读:
    Atos cannot get symbols from dSYM of archived application
    iOS 中捕获程序崩溃日志 (2014-04-22 17:35:59)
    mysql创建索引
    maven整理项目spring配置文件加载问题
    js继承
    创建对象的方式
    js闭包
    js两种创建对象方式
    shiro-web整合
    shiro连接数据库
  • 原文地址:https://www.cnblogs.com/bbbblog/p/4886232.html
Copyright © 2020-2023  润新知