题目描述:
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
示例 1:
输入: nums =[1,2,3,4]
输出:[24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
提示:
2 <= nums.length <= 105
-30 <= nums[i] <= 30
- 输入 保证 数组
answer[i]
在 32 位 整数范围内
我的作答:
第一次接触上三角和下三角的概念呃呃呃
class Solution(object):
def productExceptSelf(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
if not nums: return None
pre = [1]*len(nums)
pre[0] = nums[0]
back = [1]*len(nums)
back[-1] = nums[-1]
result = []
for left in range(1, len(nums)):
pre[left] = pre[left-1]*nums[left] #下三角
for right in range(len(nums)-2, -1, -1):
back[right] = back[right+1]*nums[right] #上三角
for i in range(len(nums)):
if i==0: result.append(back[1])
elif i==len(nums)-1: result.append(pre[i-1])
else:
result.append(pre[i-1]*back[i+1])
return result
参考:
其实在另一个三角的时候就可以乘积了
class Solution(object):
def productExceptSelf(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
ans, tmp = [1] * len(nums), 1
for i in range(1, len(nums)):
ans[i] = ans[i - 1] * nums[i - 1] # 下三角
for i in range(len(nums) - 2, -1, -1):
tmp *= nums[i + 1] # 上三角
ans[i] *= tmp # 下三角 * 上三角
return ans