0x3f 第19天 javase黑马81-87 ,三更1-23 hot100子串

子串的前缀和预处理

比如 nums=1,2,3,4,5,6,要想计算子数组 3,4,5 的元素和,可以用前缀 1,2,3,4,5 的元素和,减去另一个前缀 1,2 的元素和

  1. 理解「空间换时间」的思想:用 __init__ 预处理前缀和数组(牺牲 O (n) 空间)

用O (n) 空间得到子串的前缀和,对于实际工程中(如数据库查询、缓存系统)的常见场景 ------ 预处理的价值正是体现在 "多次复用" 上

两处错误

复制代码
class NumArray:

    def __init__(self, nums: List[int]):
        s = [0]*(len(nums)+1)
        for i,x in enumerate(nums):
            s[i+1]=s[i]+x
        ----------------

    def sumRange(self, left: int, right: int) -> int:
        return self.s[right+1]-self.s[left-1]

1.init函数里必须写上self.s =s

  • s__init__ 里的局部变量 ,如果不赋值给 self.s__init__ 执行完后 s 就会被 Python 回收,sumRange 方法根本找不到这个前缀和数组;
  • self.s = s 相当于给实例 "存了个档",把计算好的前缀和数组永久存在实例里,后续调用任何方法(比如 sumRange)都能通过 self.s 访问到。

2.包含left和right之间的nums元素和:

return self.sright+1-self.sleft-1

应该是return self.sright+1-self.sleft,因为sleft保存的是 0-left-1 的前缀和!

时间复杂度O(n)空间复杂度O(n)

复制代码
class NumArray:

    def __init__(self, nums: List[int]):
        s = [0]*(len(nums)+1)
        for i,x in enumerate(nums):
            s[i+1]=s[i]+x
        self.s=s

    def sumRange(self, left: int, right: int) -> int:
        return self.s[right+1]-self.s[left]

和为k的子数组

不能用滑动窗口,因为有负数,滑动窗口需要满足单调性,当右端点元素进入窗口时,窗口元素和是不能减少的

零神解答加上视频具体事例,搭配食用效果极佳

https://www.bilibili.com/video/BV1gN411E7Zx/?spm_id_from=333.337.search-card.all.click&vd_source=b5cc04f324fc9d6ee48a5febd77392fc

1.核心思想包括

1.前缀和s,因此可以把题目化简为求s 中有多少对下标 (i,j) 满足sj−si=k?

1.1写成 sj+(−si)=k 就能看得更明白,这是梦开始的地方------1. 两数之和

1.2两数之和的思路就是枚举右端点,不断存入哈希表,遇到满足的target-right的left

去哈希表里查找有没有遍历到过 left

2.引入cnt记录枚举过的sj,key为sj

2.1对于本题就是for sj in s:

去cnt里找sj-k

比如遍历到sj=16这个情况,16-k=10,发现前面的cnt10有两个,那就直接说明有两解

一些额外的思考,关于cnt这个小东西的

这种习惯不是强制的,但符合 "见名知意" 的编码原则 ------ 看到 Counter 就知道是 "统计频次",看到 defaultdict(int) 就知道是 "通用计数"。

之前遇到过cnt = Counter()

这个题是 cnt = defaultdict(int),但是发现使用的目的是相同的,就引发了些思考

总结一下就是

在力扣的字符串类题目中(比如找异位词、最长无重复子串、字符频率统计),开发者的默认习惯是:

  • 只要涉及「字符频次」,优先用 Counter(无需额外思考,语义直观);
  • defaultdict(int) 更多用在「非字符计数场景」(比如前缀和次数、数字出现次数、自定义对象计数)。
复制代码
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        s = [0]*(len(nums)+1)
        ans = 0
        for i,x in enumerate(nums):
            s[i+1] = s[i]+x
        cnt = defaultdict(int)
        for sj in s:
            ans += cnt[sj-k]
            cnt[sj]+=1
        return ans

优化:边求前缀和,边找和为k 的解

复制代码
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        ans = 0
        cnt = defaultdict(int)
        cnt[0]=1
        s=0
        for x in nums:
            s +=x
            ans+=cnt[s-k]
            cnt[s]+=1
        return ans
相关推荐
财经资讯数据_灵砚智能20 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月10日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
namexingyun20 小时前
拆解Fable 5三重安全护栏:模型路由、蒸馏防护与生物安全分类器的技术原理 - 微元算力(weytoken)
java·人工智能·python·安全·架构·ai编程
chenment20 小时前
别再为每个模型单独写一套队列了:用 200 行代码封装多模态统一调用层
人工智能·python·产品
退休倒计时20 小时前
【每日一题】LeetCode 142. 环形链表 II TypeScript
算法·leetcode·链表·typescript
啊森要自信21 小时前
【GUI自动化测试】控件、鼠标键盘操作与多场景自动化
c语言·开发语言·python·adb·ipython
YJlio21 小时前
《Sysinternals实战指南》16.5 Ctrl2Cap 工具详解:把 Caps Lock 变成 Ctrl 的键盘改造与回退方法
linux·运维·服务器·网络·python·学习·计算机外设
某林21221 小时前
从底层硬件死锁到 QoS 通信底层的全链路复盘
python·ros2·qos
Jutick21 小时前
WebSocket 连接没断,行情却停了:如何给实时数据流加双层 watchdog?
python
石头城的小石头21 小时前
【从0到1的鼠标位置显示记录器,基于python环境pycharm下编译实施,最终打包为exe,欢迎交流】
python·目标跟踪·pycharm·计算机外设·鼠标
用户83562907805121 小时前
Python 操作 Word 修订跟踪(Track Changes)
后端·python