求数组内有多少段区间和落在low和high的闭区间内,要求时间复杂度小于O(n^2)
- 先求出累计和sum,如果没有时间复杂度的限制的话,应该遍历,用后面的sum[j]减去前面的sum[i],只要落在区间内就+1
- 但是要限制复杂度,所以我们想到利用排序来减少一些不必要的重复。可以利用分治思想,先计算出端点在每个子区间内的数量,然后再计算端点落在相邻不同区间的数量。在分治的同时,完成归并排序,不破坏两个相邻区间内数先后关系(必须要后面减前面),同时两个区间内部变为有序,使得搜索右端点不需要从新的左端点开始,而是从前面的位置继续即可。
C++ Code
1 | class Solution { |