LC327树状数组与归并排序
327. 区间和的个数huawei-小店的经营分析归并排序# 归并排序思路伪代码defmerge_sort(nums,l,r):iflr:return0mid(lr)//2countmerge_sort(nums,l,mid)merge_sort(nums,mid1,r)# 统计跨越左右两部分的合格对数 (利用左右已有序的特性)ijmid1forleft_valinnums[l:mid1]:whileirandnums[i]-left_vallower:i1whilejrandnums[j]-left_valupper:j1countj-i nums[l:r1]sorted(nums[l:r1])# 排序以供上一层使用returncount树状数组使用树状数组BIT解决“区间和在[ L , R ] [L, R][L,R]之间的子数组数量”问题核心是将前缀和的数值映射到排名Rank上。因为树状数组的下标必须是正整数而前缀和S i S_iSi的值域可能非常大比如10 9 10^9109或者是负数所以我们必须先进行离散化。1. 离散化解决下标问题我们要查询的是S j − R ≤ S i ≤ S j − L S_j - R \le S_i \le S_j - LSj−R≤Si≤Sj−L。这里面涉及到的所有数值包括所有的前缀和S j S_jSj所有的查询边界S j − L S_j - LSj−L和S j − R S_j - RSj−R把这些数全部丢进一个列表排序并去重每个数字就都有了一个唯一的“排名”。2. 树状数组核心逻辑树状数组在这里扮演的角色是一个计数器。update(rank, 1)表示“排名为rank的前缀和出现了一次”。query(rank)表示“查询排名小于等于rank的前缀和总共有多少个”。3. 代码实现importbisectdefcountRangeSum(nums,l,r):# 1. 计算所有前缀和s0prefix_sums[0]forxinnums:sx prefix_sums.append(s)# 2. 离散化收集所有相关的数值建立数值到排名的映射all_numbersset()forxinprefix_sums:all_numbers.add(x)all_numbers.add(x-l)all_numbers.add(x-r)# 排序去重映射为 1, 2, 3...sorted_nodessorted(list(all_numbers))rank_map{val:i1fori,valinenumerate(sorted_nodes)}# 3. 树状数组标准模板n_nodeslen(sorted_nodes)tree[0]*(n_nodes1)defupdate(i,delta):whilein_nodes:tree[i]delta ii(-i)defquery(i):res0whilei0:restree[i]i-i(-i)returnres# 4. 遍历并统计ans0forxinprefix_sums:# 查询落在 [x-r, x-l] 范围内的旧前缀和数量# 即count(x-l) - count(x-r-1)left_rankrank_map[x-r]right_rankrank_map[x-l]ansquery(right_rank)-query(left_rank-1)# 将当前前缀和放入树状数组计数update(rank_map[x],1)returnans# 测试print(countRangeSum([-2,5,-1],-2,2))# 输出应该为 34. 为什么这样做是O ( N log N ) O(N \log N)O(NlogN)离散化排序耗时O ( N log N ) O(N \log N)O(NlogN)。遍历循环N NN次。查询与更新树状数组每次操作都是O ( log ( 离散化后的长度 ) ) O(\log (\text{离散化后的长度}))O(log(离散化后的长度))。由于离散化长度最多为3 N 3N3N所以单次操作依然是O ( log N ) O(\log N)O(logN)。总计O ( N log N ) O(N \log N)O(NlogN)。5. 树状数组 vs 归并排序在这个题上树状数组优点逻辑非常统一就是“计数”。缺点必须离散化。如果没搞明白离散化这 5-10 行核心代码你也用不起来。归并排序优点直接处理数值不需要映射。缺点递归逻辑稍微复杂一点。总结树状数组的“短”是建立在**预处理离散化**的基础上的。如果你能熟练写出离散化树状数组确实是处理动态频率统计的神器
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2494097.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!