【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 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- 求區間不同數的個數【樹狀陣列求解】陣列
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列
- HDU 1556 Color the ball(線段樹|樹狀陣列)陣列
- [leetCode]327. 區間和的個數LeetCode
- 線段樹維護區間等差數列
- LeetCode C++ 劍指 Offer 51. 陣列中的逆序對【歸併排序/樹狀陣列/線段樹】LeetCodeC++陣列排序
- 樹狀陣列的區間查詢與區間修改陣列
- 2024年暑假關於線段樹和樹狀陣列的小知識點陣列
- 樹狀陣列陣列
- POJ3468 A Simple Problem with Integers---樹狀陣列(區間問題)陣列
- 樹狀陣列和逆序對陣列
- AcWing 242. 一個簡單的整數問題(樹狀陣列解法)陣列
- 樹狀陣列模板+習題集陣列
- 線段樹 區間乘法加法混合
- HDU 1556【區間更新+單點查詢 樹狀陣列】陣列
- 解析樹狀陣列陣列
- 數列求和【線段樹基礎】
- HDU 2795 Billboard(線段樹 區間最大)
- 線段樹(3)——區間操作疊加
- 線段樹(1)建樹、單點修改、單點查詢、區間查詢和例題
- 327. 區間和的個數 (歸併排序)排序
- 二維樹狀陣列陣列
- 樹狀陣列詳解陣列
- 樹狀陣列基礎陣列
- 區間演算法題用線段樹可以秒解?演算法
- 關於區間操作查詢(字首和與差分)+樹狀陣列基礎陣列
- 芻議線段樹 2 (區間修改,區間查詢)
- LeetCode每日一題: 陣列形式的整數加法(No.989)LeetCode每日一題陣列
- 洛谷題單指南-二叉堆與樹狀陣列-P3368 【模板】樹狀陣列 2陣列
- HDU1166 敵兵佈陣【樹狀陣列 單點修改+區間查詢】陣列
- 樹狀陣列快速入門陣列
- 【筆記/模板】樹狀陣列筆記陣列
- 【js】Leetcode每日一題-葉子相似的樹JSLeetCode每日一題
- HDU 1754 I Hate It (線段樹 區間最值)
- 區間k小值(可持久化線段樹)持久化
- LeetCode每日一題: 有序陣列的平方(No.977)LeetCode每日一題陣列