Leetcode 560. 和为 K 的子数组

心路历程:

一开始用动态规划求解的,因为很明显这是一个背包问题,但是超内存了

从网上看到需要用数组的前缀和去解决

注意的点:

1、前缀和初始字典为{0:1},含义是第0个前边元素的前缀和为0

2、需要先查找再添加新的前缀和,否则当k=0的时候会重复计算;并且相当于在k=0的时候要自己减去自己,得到空集是没有意义的。

解法:数组前缀和*

python 复制代码
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 数组前缀和去解决
        pre_sum = 0
        predict = {0: 1} # ?
        res = 0
        for i in range(0, len(nums)):
            pre_sum += nums[i]
            prej = pre_sum - k
            if prej in predict.keys():
                res += predict[prej]
            # 先查找后添加?
            if pre_sum in predict.keys():
                predict[pre_sum] += 1
            else:
                predict[pre_sum] = 1
        return res


                

超内存解法:动态规划+背包

python 复制代码
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 动态规划+01背包: 超内存
        @cache
        def dp(i, n):  # 以nums[i]为结尾的子数组的和为n的子数组个数
            if i == 0: return int(nums[0] == n)

            if nums[i] == n:  # 可以选也可以不选 i-1
                return 1 + dp(i-1, n-nums[i])  # max(1, 1 + dp(i-1, n-nums[i]))
            else:  # 只能选i-1
                return dp(i-1, n-nums[i])

        count = 0
        for i in range(len(nums)):
            count += dp(i, k)
        return count
相关推荐
小欣加油2 小时前
leetcode3751 范围内总波动值I
java·数据结构·c++·算法·leetcode
Halo_tjn2 小时前
反射与设计模式1
java·开发语言·算法
V搜xhliang02463 小时前
临床科研新范式:从选题到投稿,AI智能体如何接管全流程?
运维·数据结构·人工智能·算法·microsoft·数据挖掘·自动化
计算机安禾4 小时前
【算法分析与设计】第46篇:近似难度与不可近似性理论
网络协议·算法·ssl
小bo波4 小时前
Java Swing 可视化素数筛:动态演示 1~120 质数筛选【附完整源码】
java·算法·可视化·swing·素数
imDwAaY4 小时前
贝叶斯网络到粒子滤波Python算法实现 CS188 Proj4 学习笔记
网络·人工智能·笔记·python·学习·算法
sleven fung4 小时前
Whisper库
开发语言·人工智能·python·算法·ai·whisper
Black蜡笔小新5 小时前
自动化AI算法训练服务器DLTM零代码私有化一站式AI训练平台技术解析
人工智能·算法·自动化
Mumu12185 小时前
P3212 [HNOI2011] 任务调度
算法
KWTXX5 小时前
vibe coding-提示词
java·前端·算法