letecode 程式設計學習(4)

2021-10-10 09:11:45 字數 1878 閱讀 9043

題目:給定乙個整數陣列和乙個區間,計算有多少連續子陣列的和在區間範圍內

例如:陣列[-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 處射出一支箭,若有乙個氣球的直徑的開始和結束...