中级农民
- 积分
- 272
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-1-25
- 最后登录
- 1970-1-1
|
本帖最后由 Flora1993 于 2022-1-3 13:27 编辑
Time: O(nlgn), Space: O(2n) 求大米- /*Remove-Smallest-Peaks-in-Order
- Input: arr[] = {1, 9, 7, 8, 2, 6}
- Output: [6, 8, 9, 7, 2, 1]
- Explanation:
- First min peak = 6, as 2 < 6.
- The array after removing min peak will be [1, 9, 7, 8, 2].
- Second min peak = 8, as 7 < 8 > 2.
- The array after removing min peak will be [1, 9, 7, 2]
- Third min peak = 9, as 1 < 9 > 7.
- The array after removing min peak will be [1, 7, 2]
- Fourth min peak = 7, as 1 < 7 > 2.
- The array after removing min peak will be [1, 2]
- Fifth min peak = 2, as 1 < 2.
- The array after removing min peak will be [1]
- Sixth min peak = 1.
- Therefore, the list of minimum peak is [6, 8, 9, 7, 2, 1].
- */
- class Node {
- public:
- Node *pre =NULL, *nxt = NULL;
- int val;
- Node(int v){
- val = v;
- }
- };
- Node* tail = NULL;
- set<int> findPeaks(vector<int>& a){
- set<int> ret;
- int n = a.size();
- if(n==1) return set<int>{a[0]};
- for(int i = 0; i < n; i++){
- if(i == 0 && a[i] > a[i+1]){
- ret.insert(a[i]);
- }else if(i == n-1 && a[i] > a[i-1]){
- ret.insert(a[i]);
- }else if(a[i] > a[i+1] && a[i] > a[i-1]){
- ret.insert(a[i]);
- }
- }
- return ret;
- }
- Node* addNode(int v){
- auto n = new Node(v);
- if(tail != NULL){
- tail->nxt = n;
- n->pre = tail;
- }
- tail = n;
- return n;
- }
- void removeNode(Node* n){
- if(n->pre != NULL && n->nxt != NULL){
- n->pre->nxt = n->nxt;
- n->nxt->pre = n->pre;
- }else if(n->pre != NULL){
- n->pre->nxt = NULL;
- }else if(n->nxt != NULL){
- n->nxt->pre = NULL;
- }
- delete(n);
- }
- bool isPeak(Node* n){
- if(n == NULL) return false;
- if(n->pre != NULL && n->nxt != NULL)
- return n->pre->val < n->val && n->nxt->val < n->val;
- if(n->pre != NULL)
- return n->pre->val < n->val;
- if(n->nxt != NULL)
- return n->nxt->val < n->val;
- return true;
- }
- vector<int> removePeaks(vector<int>& a){
- auto peaks = findPeaks(a);
- // (9, 8) -> (8, 9) -> asc -> true -> a.first > b.first;
- // (9, 8) -> (9, 8) -> desc -> false -> a.first < b.first;
- auto cmp = [](pair<int, Node*>& a, pair<int, Node*>& b){
- return a.first > b.first;
- };
- priority_queue<pair<int, Node*>, vector<pair<int, Node*>>, decltype(cmp)> q(cmp);
- for(auto n : a){
- auto node = addNode(n);
- if(peaks.count(n)){
- q.push({n, node});
- }
- }
- vector<int> res;
- while(!q.empty()){
- auto elem = q.top();
- res.push_back(elem.first);
- q.pop();
- auto pre = elem.second->pre;
- auto nxt = elem.second->nxt;
- removeNode(elem.second);
- if(isPeak(pre)) q.push({pre->val, pre});
- if(isPeak(nxt)) q.push({nxt->val, nxt});
- }
- return res;
- }
- int main() {
- vector<int> a {1, 9, 7, 8, 2, 6};
- for(auto n :removePeaks(a)) cout << n << " ";
- cout << endl;
- }
复制代码 |
|