【Leetcode每日一題】327. 區間和的個數(線段樹/樹狀陣列)
Leetcode 每日一題
題目連結: 327. 區間和的個數
難度: 困難
解題思路: 今天有急事,來不及做了。大概看了一下,區間問題,要求時間複雜度小於O(n*n)。很容易想到用線段樹或者樹狀陣列,搬運Leetcode 官方題解。
題解:
struct SegNode {
int lo, hi, add;
SegNode* lchild, *rchild;
SegNode(int left, int right): lo(left), hi(right), add(0), lchild(nullptr), rchild(nullptr) {}
};
class Solution {
public:
SegNode* build(int left, int right) {
SegNode* node = new SegNode(left, right);
if (left == right) {
return node;
}
int mid = (left + right) / 2;
node->lchild = build(left, mid);
node->rchild = build(mid + 1, right);
return node;
}
void insert(SegNode* root, int val) {
root->add++;
if (root->lo == root->hi) {
return;
}
int mid = (root->lo + root->hi) / 2;
if (val <= mid) {
insert(root->lchild, val);
}
else {
insert(root->rchild, val);
}
}
int count(SegNode* root, int left, int right) const {
if (left > root->hi || right < root->lo) {
return 0;
}
if (left <= root->lo && root->hi <= right) {
return root->add;
}
return count(root->lchild, left, right) + count(root->rchild, left, right);
}
int countRangeSum(vector<int>& nums, int lower, int upper) {
long long sum = 0;
vector<long long> preSum = {0};
for (int v: nums) {
sum += v;
preSum.push_back(sum);
}
set<long long> allNumbers;
for (long long x: preSum) {
allNumbers.insert(x);
allNumbers.insert(x - lower);
allNumbers.insert(x - upper);
}
// 利用雜湊表進行離散化
unordered_map<long long, int> values;
int idx = 0;
for (long long x: allNumbers) {
values[x] = idx;
idx++;
}
SegNode* root = build(0, values.size() - 1);
int ret = 0;
for (long long x: preSum) {
int left = values[x - upper], right = values[x - lower];
ret += count(root, left, right);
insert(root, values[x]);
}
return ret;
}
};
作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/count-of-range-sum/solution/qu-jian-he-de-ge-shu-by-leetcode-solution/
來源:力扣(LeetCode)
相關文章
- Leetcode 327. 區間和的個數 (字首和 + 離散化 + 樹狀陣列)LeetCode陣列
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- 求區間不同數的個數【樹狀陣列求解】陣列
- 線段樹+差分——【模板】樹狀陣列2陣列
- hdu 4836 The Query on the Tree(線段樹or樹狀陣列)陣列
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列
- light oj 1080 線段樹和樹狀陣列陣列
- D 區間求和 [數學 樹狀陣列]陣列
- 線段樹維護區間等差數列
- HDU 1556 Color the ball(線段樹|樹狀陣列)陣列
- [leetCode]327. 區間和的個數LeetCode
- 樹狀陣列的區間查詢與區間修改陣列
- 【樹狀陣列 區間更新區間查詢】code陣列
- LeetCode C++ 劍指 Offer 51. 陣列中的逆序對【歸併排序/樹狀陣列/線段樹】LeetCodeC++陣列排序
- hdu4417 樹狀陣列(求指定區間比指定數小的數的個數)陣列
- 2024年暑假關於線段樹和樹狀陣列的小知識點陣列
- hihocoder 1078 線段樹的區間修改 (線段樹 區間更新 模板)
- 樹狀陣列陣列
- SPOJ DQUERY (離線數狀陣列||線上主席樹)陣列
- 變化的區間樹狀陣列,單點查詢陣列
- 樹狀陣列單點更新和區間查詢陣列
- POJ3468 A Simple Problem with Integers---樹狀陣列(區間問題)陣列
- 樹狀陣列和逆序對陣列
- 數列求和【線段樹基礎】
- 樹狀陣列模板+習題集陣列
- 解析樹狀陣列陣列
- AcWing 242. 一個簡單的整數問題(樹狀陣列解法)陣列
- 線段樹(3)——區間操作疊加
- 327. 區間和的個數 (歸併排序)排序
- 線段樹(1)建樹、單點修改、單點查詢、區間查詢和例題
- HDU 1556【區間更新+單點查詢 樹狀陣列】陣列
- 【樹狀陣列 區間修改,單點求值】1556 Color the ball陣列
- hdu 4368 樹狀陣列 離線維護陣列
- 樹狀陣列詳解陣列
- 樹狀陣列基礎陣列
- poj 2481 樹狀陣列陣列
- hdu 3874 樹狀陣列陣列
- 二維樹狀陣列陣列