303. 区域和检索 - 数组不可变(前缀和模板)
暴力解
没有前缀和数组帮忙,这个my_nums只是用来存用户传来的数组的
前缀和 代码
有一个前缀和数组,这样构造的时候只麻烦一次,查询的时候就很简单了。
前缀和数组v【i】,表示的是前i个数的前缀和,所以我们必须写v【0】=0,这样统一后,代码会好写很多。
560. 和为 K 的子数组
暴力解法
索引 i 和 j 确定一个子数组,枚举出所有子数组,子数组求和等于 k 的话则 count++。
- 首先并不能用滑动窗口()
- 所以我们用前缀和的方法
第二个循环中的逻辑(有点绕,但是很简单)
使用前缀和时,
- 前缀和数组必须s[0]=0(前0个数的和是0,无可厚非吧)
- 先查cnt表,再填cnt表,不能颠倒。
代码,2个循环
第一个循环用来填好前缀和表s
第二个循环查cnt表,填cnt表。取代前缀和用来查询,将n^2提升到n
查是find(sj-k)
填是cnt[sj]++ (因为取代的前缀和s,要把s的数据都填入表内)
一次遍历 代码
为了和后面的437. 路径总和 III代码统一,记这个一次遍历的代码会好些。
注意:
- cnt是用来记录前缀和的次数的。所以前缀和是0的时候,必然有一次