215. 数组中的第K个最大元素
快排思想
只要找到k在第几个区间就行
class Solution {
int quickselect(int[] nums, int l, int r, int k){
if(l == r){
return nums[k];
}
int partition = nums[l], i = l - 1 , j = r + 1;
while(i < j){
do i++; while(nums[i] < partition);
do j--; while(nums[j] > partition);
if(i < j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
if(k < i) return quickselect(nums, l ,j ,k);
return quickselect(nums, j + 1, r, k);
}
public int findKthLargest(int[] nums, int k) {
int n = nums.length;
return quickselect(nums, 0, n - 1, n - k);
}
}
class Solution(object):
def findKthLargest(self, nums, k):
def quickselect(arr, l, r, k):
if l == r:
return arr[k]
x = arr[l]
i, j = l - 1, r + 1 # 初始化双指针
while i < j:
# 模拟 Java 的 do-while 结构
i += 1
while arr[i] < x:
i += 1
j -= 1
while arr[j] > x:
j -= 1
if i < j:
arr[i], arr[j] = arr[j], arr[i] # Python 式交换
if k <= j:
return quickselect(arr, l, j, k)
else:
return quickselect(arr, j + 1, r, k)
n = len(nums)
return quickselect(nums, 0, n - 1, n - k)
堆排序
只要输出第k大的数就行,大根堆
class Solution {
void maxHeapify(int[] a, int i , int heapSize){
int l = 2 * i + 1, r = 2 * i + 2, largest = i;
if(l < heapSize && a[l] > a[largest]){
largest = l;
}
if(r < heapSize && a[r] > a[largest]){
largest = r;
}
if(largest != i){
swap(a, i, largest);
maxHeapify(a, largest, heapSize);
}
}
void buildMaxHeap(int[] a, int heapSize){
for(int i = heapSize / 2 - 1; i >= 0; i--){
maxHeapify(a, i, heapSize);
}
}
void swap(int[] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public int findKthLargest(int[] nums, int k) {
int heapSize = nums.length;
buildMaxHeap(nums, heapSize);
for(int i = 0; i < k - 1; i++){
swap(nums, 0, heapSize - 1);
heapSize--;
maxHeapify(nums, 0, heapSize);
System.out.println("调整后的"+nums[0]);
}
return nums[0];
}
}
浙公网安备 33010602011771号