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];
    }
}
posted on 2025-02-18 11:47  爱吐水的小火龙  阅读(5)  评论(0)    收藏  举报