一、适用范围
涉及到要进行前后缀分解的问题
例如leetcode的以下问题:
Problem: 238. 除自身以外数组的乘积
Problem: 2256. 最小平均差
Problem: 2420. 找到所有好下标
Problem: 2483. 商店的最少代价
Problem: 1653. 使字符串平衡的最少删除次数
Problem: 2167. 移除所有载有违禁货物车厢所需的最少时间
Problem: 1930. 长度为 3 的不同回文子序列
Problem: 2484. 统计回文子序列数目
二、238题:除自身以外数组之积
给你一个整数数组
nums
,返回 数组answer
,其中answer[i]
等于nums
中除nums[i]
之外其余各元素的乘积 。题目数据 保证 数组
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法,且在
O(n)
时间复杂度内完成此题。
示例 1:
输入: nums =[1,2,3,4]
输出:[24,12,8,6]
遇到的问题:暴力解决会严重超时
三、套路方法
1、思路
根据题意,按照要求正序枚举、倒序枚举分别得到preprepre和sufsufsuf 数组。
最后统计答案就好。
pre为左侧数据之积:pre[0]=1,1~n的左侧用之前的左侧之积×当前位置左侧的数据
pre[i]=pre[i-1]×nums[i-1]
suf为右侧数据之积:suf[n-1]=1,0~n-2的右侧用后面的右侧之积×当前位置右侧的数据
for i in reversed(range(length - 1)):
R[i] = nums[i + 1] * R[i + 1]
或者
for i in range(n-2,-1,-1):
suf[i] = suf[i+1] * nums[i+1]
有些题适合分别枚举得到完整的preprepre和sufsufsuf 数组再进行答案统计。
而有些题适合先得到完整 sufsufsuf 数组,再在得到preprepre的过程中进行答案统计。
2、方法
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
n = len(nums)
pre = [1] * n
suf = [1] * n
for i in range(1,n):
pre[i] = pre[i-1] * nums[i-1]
for i in range(n-2,-1,-1):
suf[i] = suf[i+1] * nums[i+1]
ans = [1] * n
for i in range(n):
ans[i] = pre[i] * suf[i]
return ans