数据结构
前缀和结构
特征:
连续子数组的元素和
技巧:
-
-
len(前缀和) = len(list)+1
-
-
-
前缀和可以作为list的v,也可做为list的index!----哈希表 (问的是xxx的数目)
-
-
-
presum = [0] + list(accumulate(nums)) --- 得到前缀和数组 accumulate函数可以累加nums的值
-
-
-
哈希表使用defaultdict函数生成,可以避免key不存在报错的判断,不存在会返回0 前缀和不是一定每个都要维护--视情况而定,(比如奇数前缀和、偶数前缀和) 前缀和构造完后往往与二分查找配套使用,二如果在构造前缀和的时候做了预处理,就可以不适用二分查找
-
条件性构造
技巧
当原数组较小的时候,且一维的前缀和数组不能直接给出答案的时候,(超时的情况下),可以进行初始化
构造二维前缀和数组(n*n),然后对上三角进行初始化,构造出可以给出答案的前缀和数组
这样就复杂度可以从 (m*)转变为(m+) ---m为题目查询数组的长度
如果map[int]int 值定义为下标时,初始化为{0,-1}!!
定义为下标的时候,只有不满足取值的情况下,才对哈希表赋值
map[sum] = index----防止下标被后面的覆盖
如果是定义为次数——初始化为{0,1}
哈希表无条件赋值
m[sum]++
哈希表做到505——
距离和
特点:
? 绝对值操作,(数组各个元素与当前元素的差操作)
距离和可以转化为蓝绿面积公式
前提:
1. 有序(无序就自己排序)
目标值为中间值
蓝色面积为 target左边的元素和
特征,[0,target)<target
所以左边元素的距离和就是 target*nums[target]- preSum[target]
绿色面积为target右边的元素和
特征,(target,n]>target
所以右边元素的距离和就是 pre[n]-pre[target]-(n-target)*nums[target]
其中target的位置可以用二分查找
利用前缀和构造或优化二分查找的过程
做到2602