数据结构

前缀和结构

特征:
连续子数组的元素和
技巧:

    • 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


posted @ 2024-05-07 16:12  一个偷偷自学的小笨蛋  阅读(10)  评论(0)    收藏  举报