中级农民
- 积分
- 100
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2021-2-28
- 最后登录
- 1970-1-1
|
第二题, 用double linked list和priority queue,总的时间复杂度是O(NlogN),但写得挺长的。
- struct Node {
- Node *prev, *next;
- int val;
- Node (int num) {
- prev = next = NULL;
- val = num;
- }
- };
- void insert(Node *&head, Node *&tail, int num)
- {
- Node *node = new Node(num);
- node->prev = tail;
- if (tail)
- tail->next = node;
- else
- head = node;
- tail = node;
- }
- void remove(Node *&head, Node *&tail, Node *node)
- {
- Node *prev = node->prev;
- Node *next = node->next;
- if (prev)
- prev->next = next;
- if (next)
- next->prev = prev;
- if (head == node)
- head = next;
- if (tail == node)
- tail = prev;
- }
- struct comp {
- bool operator()(const Node *n1, const Node *n2) {
- return n1->val > n2->val;
- }
- };
- bool is_peek(Node *node)
- {
- int prev_num = INT_MIN, next_num = INT_MIN;
- if (node->prev)
- prev_num = node->prev->val;
- if (node->next)
- next_num = node->next->val;
- if (node->val > prev_num && node->val > next_num)
- return true;
- return false;
- }
- vector<int> smallest_peeks(vector<int> &nums)
- {
- priority_queue<Node *, vector<Node *>, comp> pq;
- Node *head = NULL, *tail = NULL;
- for (int num : nums)
- insert(head, tail, num);
- Node *node = head;
- while (node) {
- if (is_peek(node))
- pq.push(node);
- node = node->next;
- }
- vector<int> result;
- while (!pq.empty()) {
- Node *node = pq.top(); pq.pop();
- Node *prev_node = node->prev;
- Node *next_node = node->next;
- result.push_back(node->val);
- remove(head, tail, node);
- if (prev_node && is_peek(prev_node))
- pq.push(prev_node);
- if (next_node && is_peek(next_node))
- pq.push(next_node);
- }
- return result;
- }
- int main()
- {
- vector<int> nums = {3, 5, 1, 4, 2};
- vector<int> result = smallest_peeks(nums);
- for (int r : result)
- cout << r << " ";
- cout << endl;
- return 0;
- }
复制代码
|
|