每日一道算法题--leetcode 238--除自身以外数组的乘积--python

660 阅读1分钟

【题目描述】

【代码思路】

这道题主要是题干有要求,一是不允许使用除法,这就打消了我先求出数组累乘之积,再除以各个nums[i]的念头。二是要求时间复杂度是线性的,因此不可以双层循环嵌套。

因此考虑左数组和右数组,左数组保存的是nums[i]之前的所有元素之积,右数组保存的是nums[i]之后的所有元素之积,这样一来,求output[i]就可以直接用相应位置的左右数组相乘即可了。这个方法的时间复杂度是线性的,空间复杂度为O(1),只需要一个保存num变量的存储空间即可。

这里说一下,实现对应位置左右数组相乘的方式,用到了python 中的map函数和zip函数。

left=[1,2]
right=[3,4]
output=list(map(lambda x:x[0]*x[1],list(zip(left,right ))))

【源代码】

class Solution(object):
    def productExceptSelf(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        left=[]
        right=[]
        num=1
        for i in range(len(nums)):
            left.append(num)
            num*=nums[i]
        num=1
        for i in reversed(range(len(nums))):
            right.append(num)
            num*=nums[i] 
        return map(lambda (x,y):x*y,zip(left,reversed(right) ))