classSolution { public: vector<int> sortArray(vector<int> &nums){ int n = nums.size(); vector<int> tmp(n); merge_sort(nums, 0, n - 1, tmp); return nums; }
voidmerge_sort(vector<int> &nums, int left, int right, vector<int> &tmp){ if (left >= right) return; int m = left + (right - left) / 2; // cout << left << " " << right << endl; merge_sort(nums, left, m, tmp); merge_sort(nums, m + 1, right, tmp);
int p = left, q = m + 1, i = left; while (p <= m || q <= right) { if (q > right || (p <= m && nums[p] <= nums[q])) { tmp[i++] = nums[p++]; } else { tmp[i++] = nums[q++]; } }
for (int i = left; i <= right; i++) { nums[i] = tmp[i]; } } };
classSolution { public: intfindKthLargest(vector<int> &nums, int k){ if (nums.size() < k) { return-1; }
int n = nums.size() - 1; // 筛选建堆 for (int i = (n - 1) / 2; i >= 0; i--) { HeapRecify(nums, i, n); }
// 执行k-1次删除操作 for (int i = 1; i <= k - 1; i++) { swap(nums[0], nums[n]); n--; HeapRecify(nums, 0, n); } return nums[0]; } /** * 筛选调整堆,i为堆顶,n为堆底 */ voidHeapRecify(vector<int> &nums, int i, int n){ // 存在左右孩子 while (2 * i + 2 <= n) { int m; if (nums[2 * i + 1] > nums[2 * i + 2]) { m = 2 * i + 1; } else { m = 2 * i + 2; } // 堆顶小,向下调整 if (nums[i] < nums[m]) { swap(nums[i], nums[m]); i = m; }else{ break; } } if (2 * i + 1 == n && nums[i] < nums[n]) { swap(nums[i], nums[n]); } } };
方法二:快速选择
快速排序算法思想的应用,快速排序每次可以确定一个元组的位置
#include<iostream> #include<vector> usingnamespace std; /* 找出数组中第K大的数,从0开始 */ intquickSelection(vector<int> &nums, int l, int r){ int key = nums[l]; while (l < r) { while (l < r && nums[r] >= key) { --r; } nums[l] = nums[r]; while (l < r && nums[l] <= key) { l++; } nums[r] = nums[l]; } nums[l] = key; return l; } intfindKthLargest(vector<int> &nums, int k){ int l = 0, r = nums.size() - 1; int target = nums.size() - k; while (l < r) { int mid = quickSelection(nums, l, r); // cout << "l" << l << " mid" << mid << " r" << r << endl; if (mid == target) return nums[mid]; if (mid > target) r = mid - 1; else { l = mid + 1; } } return nums[l]; }
vector<vector<int>> ans; int i = 0; int cur_x, cur_h = 0; while (i < n || !maxHeap.empty()) { if (maxHeap.empty() || (i < n && buildings[i][0] <= -maxHeap.top().second)) { cur_x = buildings[i][0]; while (i < n && buildings[i][0] <= cur_x) { maxHeap.push({buildings[i][2], -buildings[i][1]}); i++; }