详解线段树之入门(Segment Tree)
何为线段树 线段树是基于要研究的数组而构建的数据结构,呈二叉树状。线段树的叶子结点就是所要研究的数组,非叶子节点表示数组的一段区间的某个性质的值。比如此区间的和,或者最大值最小值等等。 为什么需要线段树呢?试想你需要设计一个功能,给定一个数组,需要你提供两个操作,一是更改某个元素,而是索引某个区间的和,或者最大值,或者最小值,这里以和举例。最直接也是最简单做法当然是直接在数组上操作,O(1)更新,O(N)索引和,N为区间长度。 class NumArray { public NumArray(int[] nums) { //TODO } // Updates nums[index] = val. public void update(int index, int val) { //TODO} // Gets sum of nums[left ... right]. public int query(int left, int right) { //TODO } } 再进一步,如果需要更新一个区间的元素呢,比如,nums[i] += val, for left <= i <= right。 class NumArray { // ... // Add val, for nums[i] with left <= i <= right public int add(int left, int right, int val) { //TODO } } 继续以上方法,就是遍历区间,一一更新,与索引相同复杂度:O(N)。...