307 區域和檢索 陣列可修改

2021-09-28 15:31:29 字數 3032 閱讀 7184

超時 

/// leetcode 307. range sum query - mutable

///

/// 使用sum陣列的思路:tle

class numarray

sum = new int[nums.length + 1];

sum[0] = 0;

for (int i = 1; i <= nums.length; i++)

}public int sumrange(int i, int j)

public void update(int index, int val)

}}

/// leetcode 307. range sum query - mutable

///

inte***ce merger

class segmenttree

tree = (e) new object[4 * arr.length];

buildsegmenttree(0, 0, arr.length - 1);

}// 在treeindex的位置建立表示區間[l...r]的線段樹

private void buildsegmenttree(int treeindex, int l, int r)

int lefttreeindex = leftchild(treeindex);

int righttreeindex = rightchild(treeindex);

// int mid = (l + r) / 2;

int mid = l + (r - l) / 2;

buildsegmenttree(lefttreeindex, l, mid);

buildsegmenttree(righttreeindex, mid + 1, r);

tree[treeindex] = merger.merge(tree[lefttreeindex], tree[righttreeindex]);

}public int getsize()

public e get(int index)

return data[index];

}// 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的左孩子節點的索引

private int leftchild(int index)

// 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的右孩子節點的索引

private int rightchild(int index)

// 返回區間[queryl, queryr]的值

public e query(int queryl, int queryr)

return query(0, 0, data.length - 1, queryl, queryr);

}// 在以treeindex為根的線段樹中[l...r]的範圍裡,搜尋區間[queryl...queryr]的值

private e query(int treeindex, int l, int r, int queryl, int queryr)

int mid = l + (r - l) / 2;

// treeindex的節點分為[l...mid]和[mid+1...r]兩部分

int lefttreeindex = leftchild(treeindex);

int righttreeindex = rightchild(treeindex);

if (queryl >= mid + 1) else if (queryr <= mid)

e leftresult = query(lefttreeindex, l, mid, queryl, mid);

e rightresult = query(righttreeindex, mid + 1, r, mid + 1, queryr);

return merger.merge(leftresult, rightresult);

}// 將index位置的值,更新為e

public void set(int index, e e)

data[index] = e;

set(0, 0, data.length - 1, index, e);

}// 在以treeindex為根的線段樹中更新index的值為e

private void set(int treeindex, int l, int r, int index, e e)

int mid = l + (r - l) / 2;

// treeindex的節點分為[l...mid]和[mid+1...r]兩部分

int lefttreeindex = leftchild(treeindex);

int righttreeindex = rightchild(treeindex);

if (index >= mid + 1) else

tree[treeindex] = merger.merge(tree[lefttreeindex], tree[righttreeindex]);

}@override

public string tostring() else

if (i != tree.length - 1)

}return res.tostring();

}}class numarray

segtree = new segmenttree<>(data, (a, b) -> a + b);}}

public void update(int i, int val)

segtree.set(i, val);

}public int sumrange(int i, int j)

return segtree.query(i, j);

}}

307 區域和檢索 陣列可修改

題目描述 給定乙個整數陣列 nums,求出陣列從索引 i 到 j i j 範圍內元素的總和,包含 i,j 兩點。update i,val 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。示例 given nums 1,3,5 sumrange 0,2 9 update 1,2 s...

307 區域和檢索 陣列可修改

給定乙個整數陣列 nums,求出陣列從索引 i 到 j i j 範圍內元素的總和,包含 i,j 兩點。update i,val 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。示例 given nums 1,3,5 sumrange 0,2 9 update 1,2 sumran...

LeetCode 307 區域和檢索

給定乙個整數陣列 nums,求出陣列從索引 i 到 j i j 範圍內元素的總和,包含 i,j 兩點。update i,val 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。利用樹狀陣列實現。from typing import class numarray def init ...