238.除自身以外数组的乘积

暴力法

看到题目,第一个想法就是用for循环遍历整个数组,然后对每个位置的数求其他位置所有数的乘积保存下来。这样的话一个for循环一个while循环,时间复杂度应该是n*(n-1)也就是O(n^2)的复杂度,显然不满足题意,结果也是,在完成第16/17个例子的时候时间溢出了。

16 / 17 个通过 测试用例状态:超出时间限制
class Solution:
    def productExceptSelf(self, nums) :
        aim = []
        for i in range(len(nums)):
            j = 0
            k = 1
            while j < len(nums):
                if i == j:
                    pass
                else:
                    k *= nums[j]
                j += 1
            aim.append(k)
        return aim

改进

然后看到了评论中从左往右算乘积和从右向左算乘积,最后将左右乘积相乘= = 行吧。。。我是没想到

class Solution:
    def productExceptSelf(self, nums) :
        left = [1]
        right = [1]
        result = []
        l = len(nums)
        for i in range(1,l):
            left.append(left[i-1]*nums[i-1])
        for j in range(1,l):
            right.append(right[j-1]*nums[l-j])
        for k in range(l):
            result.append(left[k]*right[-k-1])
        print(left,right,)
        return result

改进2

将从左向右乘部分与计算结果合在一起。

执行用时: 140 ms 在Product of Array Except Self的Python3提交中击败了59.14% 的用户
内存消耗: 20.4 MB 在Product of Array Except Self的Python3提交中击败了0.00% 的用户
class Solution:
    def productExceptSelf(self, nums) :
        left = 1
        right = [1]
        result = []
        l = len(nums)
        for j in range(1,l):
            right.append(right[j-1]*nums[l-j])
        for k in range(l):
            result.append(left*right[-k-1])
            left *= nums[k]
        return result

你可能感兴趣的:(leetcode)