LeetCode 以238.为例的前后缀分解方法

一、适用范围

        涉及到要进行前后缀分解的问题

例如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) 时间复杂度内完成此题。

题目链接https://leetcode.cn/problems/product-of-array-except-self/solutions/2260974/qian-hou-zhui-fen-jie-mo-ban-tao-lu-zong-313h/icon-default.png?t=N7T8https://leetcode.cn/problems/product-of-array-except-self/solutions/2260974/qian-hou-zhui-fen-jie-mo-ban-tao-lu-zong-313h/

示例 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

你可能感兴趣的:(leetcode,python)