voidMerge(vector<int> &a, int left, int mid, int right) { int n1 = mid - left + 1, n2 = right - mid; vector<int> L(n1), R(n2); for (int i = 0; i < n1; i++) L[i] = a[left + i]; for (int i = 0; i < n2; i++) R[i] = a[mid + 1 + i]; int i = 0, j = 0; for (int k = left; k <= right; k++) { if (i < n1 && j < n2) { if (L[i] <= R[j]) a[k] = L[i++]; else a[k] = R[j++]; } elseif (i == n1) a[k] = R[j++]; else a[k] = L[i++]; }
} voidMergeSort(vector<int> &a, int left, int right) { if (left < right) { int mid = (left + right) / 2; MergeSort(a, left, mid); MergeSort(a, mid+1, right); Merge(a, left, mid, right); } }
//LeetCode 215: 在未排序的数组中找到第 k 个最大的元素。 classSolution { private: intPartition(vector<int>& a, int left, int right) { int x = a[right]; int i = left - 1; for (int j = left; j <= right - 1; j++) { if (a[j] >= x) // 注意这里改成了>= { i++; swap(a[i], a[j]); } } swap(a[i+1], a[right]);4 return i + 1; } intSelect(vector<int>& a, int left, int right, int i) { if (left == right) return a[left]; int x = Partition(a, left, right); int k = x - left + 1; // 当前的x是第几个数字 if (i == k) return a[x]; elseif (i < k) return Select(a, left, x - 1, i); else return Select(a, x + 1, right, i - k); } public: intfindKthLargest(vector<int>& nums, int k) { return Select(nums, 0, nums.size()-1, k); } };
v1.5.2