• leetcode 307 区域和检索 线段树(基本 无lazy)


     1 class NumArray {
     2         int MAXN;
     3         int[] sum;
     4         int[] arr;
     5 
     6         public NumArray(int[] nums) {
     7             this.arr = nums;
     8             MAXN = nums.length << 2;//4倍空间
     9             sum = new int[MAXN];
    10             build(0, arr.length - 1, 1);
    11         }
    12 
    13         private void build(int l, int r, int rt) {
    14             if (l == r) {
    15                 sum[rt] = arr[l];
    16                 return;
    17             }
    18             int mid = l + ((r - l) >> 1);
    19             build(l, mid, rt << 1);
    20             build(mid + 1, r, rt << 1 | 1);
    21             pushUp(rt, rt << 1, rt << 1 | 1);
    22         }
    23 
    24         private void pushUp(int rt, int lc, int rc) {
    25             sum[rt] = sum[lc] + sum[rc];
    26         }
    27 
    28         //nums[index] to val,本题只有单个位置的更新,所以不用维护更新表
    29         public void update(int index, int val) {
    30             update(index, index, val, 0, arr.length - 1, 1);
    31         }
    32 
    33         private void update(int l, int r, int C, int L, int R, int rt) {
    34             if (l <= L && r >= R) {//必定是l==L==R==r
    35                 sum[rt] = C;
    36                 return;
    37             }
    38             //下发任务
    39             int mid = L + ((R - L) >> 1);
    40             if (l <= mid) {
    41                 update(l, r, C, L, mid, rt << 1);
    42             }
    43             if (r > mid) {
    44                 update(l, r, C, mid + 1, R, rt << 1 | 1);
    45             }
    46             pushUp(rt, rt << 1, rt << 1 | 1);
    47         }
    48 
    49 
    50         public int sumRange(int left, int right) {
    51             return query(left, right, 0, arr.length - 1, 1);
    52         }
    53 
    54         private int query(int l, int r, int L, int R, int rt) {
    55             if (l <= L && r >= R) {
    56                 return sum[rt];
    57             }
    58             //任务下发
    59             int mid = L + ((R - L) >> 1);
    60             int ans = 0;
    61             if (l <= mid) {
    62                 ans += query(l, r, L, mid, rt << 1);
    63             }
    64             if (r > mid) {
    65                 ans += query(l, r, mid + 1, R, rt << 1 | 1);
    66             }
    67             pushUp(rt,rt<<1,rt<<1|1);//沿途没有懒着的任务,所以每次更新完整个线段树所有节点的值都是正确的,这里都不用pushUp了
    68             return ans;
    69         }
    70     }
    71 
    72 /**
    73  * Your NumArray object will be instantiated and called as such:
    74  * NumArray obj = new NumArray(nums);
    75  * obj.update(index,val);
    76  * int param_2 = obj.sumRange(left,right);
    77  */
    每天进步一点点~
  • 相关阅读:
    android中的Cursor类
    设计模式之UML类图的常见关系(一)
    关于form 上传文件时的小问题
    Javascript中最常用的61段经典代码
    自我提升mysql
    为mysql在表的某一位置增加一列
    由<a>标签的onclick影出来的问题
    第一博客
    异常的出理
    2016.7.17内部类
  • 原文地址:https://www.cnblogs.com/libin123/p/14639331.html
Copyright © 2020-2023  润新知