暴力法
看到题目,第一个想法就是用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