題目:給定乙個整數陣列和乙個區間,計算有多少連續子陣列的和在區間範圍內
例如:陣列[-3, 0, 5, -2, -2] 區間為[-1, -3]
則輸出的子陣列有[-3] [-2,] [-2], [-3, 0], [-3, 0, 5, -2, -2]這5種,輸出為5。
#include #include #include #include#includestruct treenode
treenode(int begin, int end, int index)
}struct splittree
void init(const std::vector&nums)
}treenode createsplitlinetree(const std::vector&nums, int begin, int end)
else
}int querytree(const treenode &node, int begin, int end)
if (begin > node.end || end < node.begin)
else if (begin <= node.begin && end >= node.end)
else
if (node.rightindex != -1)
return res_l + res_r;}}
int query(int begin, int end)
void updatecountintree(int index, int val)
if (val >= _maps[index].begin && val <= _maps[index].end)
}void updatecount(int val)
};int main()
; std::vectorvals(ord,size(), 0);
vals[0] = org[0];
for (int i =1; i < org.size(); i++)
std::vectorout;
std::setst(vals.begin(), vals.end());
out.assign(st.begin(), st.end());
sort(out.begin(), out.end());
splittree spt;
spt.init(out);
int begin = -3;
int end = -1;
int res = 0;
for (int i = vals.size() - 1; i >= 0; i--)
else
}return 0;
}
思路
1. 計算字首陣列vals, vals[i]表示[0, i]的陣列和。
2. 字首去重和排序,這樣是為了後面構建分段線性樹。
3. 構建分段樹splittree, 這個數的每乙個節點儲存區間和區間中的字首數值的個數。
3.vals反向遍歷,根據如下關係
end=>vals[j] - vals[i-1] >= begin
這樣 end+ vals[i-1] >= vals[j] >= vals[i-1] + begin
可以得到query區間【vals[i-1] + begin, end+ vals[i-1]】去splittree中搜尋。
這樣最終的演算法複雜程度為o(n*log(n))
letecode 程式設計學習(7)
題目奇偶鍊錶 給定乙個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o 1 時間複雜度應為 o nodes nodes 為節點總數。示例 1 輸入 1 2 3 4 ...
letecode 程式設計學習(12)
題目 在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas i 公升。你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i 1 個加油站需要消耗汽油 cost i 公升。你從其中的乙個加油站出發,開始時油箱為空。如果你可以繞環路行駛一周,則返回出發時加油站的編號,否則返回 1。說明...
letecode程式設計學習(15)
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑的開始和結束...