經常有這樣的問題,需要維護序列中每個元素向左(右)第乙個(最後乙個)大於(小於)它的值。
對此,我們完全可以使用線段樹等高階資料結構或者使用二分查詢等方式得到乙個時間複雜度為nlogn的解決方案。但對於該問題這樣做就顯得有點殺雞用牛刀了。實際上我們可以用更加簡潔的**得到一種線性的解決方案。
問題1:求每個元素向左第乙個大於它的值
解決方案:使用棧維護
#include using namespace std;
int main()
for (int i = 1; i <= n; i++)
cout << l[i] << ' ';
return 0;
}
問題2:求每個元素向左最後乙個大於它的值
解決方案:按元素值從大到小遍歷陣列中的元素下標,維護最小下標。複雜度為o(nlogn)或o(n+c)(使用桶)
#include using namespace std;
int main()
sort(nums.begin(),nums.end());
nums.erase(unique(nums.begin(),nums.end()),nums.end());
int m = (int)nums.size();
vector> pos(m + 1, vector());
for (int i = 1; i <= n; i++)
int minpos = n + 1;
for (int i = m; i >= 1; i--)
} for (int i = 1; i <= n; i++)
cout << l[i] << ' ';
return 0;
}
一些常用的資料結構維護手法
這篇會理論上講一講常用的資料結構維護手法。我是嘴巴選手我自豪!cdq分治 現在我們有一些修改,有一些詢問,修改之間獨立。我們考慮分治,對於左右兩半分別分治,然後對於左邊的修改計算對右邊詢問的貢獻。本身的複雜度是o nlogn 整體二分 現在我們有一些修改,有一些詢問。我們需要求出,在最少多少組修改之...
C語言資料結構的套路
跟著dsaa in c寫 總結起來各種資料結構大概都是這個套路 首先是定義 typedef struct xx 然後分配空間,malloc sizeof 對於用到陣列來儲存資料元素的,還要額外給陣列分配空間,比如佇列 q array malloc sizeof int max 最後用完之後一定要記得...
一 常用資料結構
優點 1.構建乙個陣列非常簡單 2.能讓我們在 o 1 的時間裡根據陣列的下標 index 查詢某個元素 缺點 1.構建時必須分配一段連續的空間 2.查詢某個元素是否存在時需要遍歷整個陣列,耗費o n 的時間 n 為元素的個數 3.刪除和新增某個元素時,同樣需要耗費o n 的時間 力扣練習242 給...