leetcode_215

这篇博客探讨了如何使用快速排序和堆(最小堆与最大堆)来找到列表中第K大的元素。通过Python实现,详细展示了快速排序的递归过程以及最小堆和最大堆的构建与调整。对于快速排序,利用其自然排序特性;而对于堆排序,通过构建最大堆并不断调整以找到第K大元素。
摘要由CSDN通过智能技术生成

利用快速排序

class Solution:
    
    def findKthLargest(self, nums: List[int], k: int) -> int:
        # 方法一:可以通过快速排序来获取结果
        return self.quicksort(nums)[len(nums) - k]
        
    
    def quicksort(self,nums: List[int]):
        # 基线条件,为空或者只包含一个元素的数组是有序的
        if len(nums) < 2:
            return nums
        else:
            # 递归条件
            pivot = nums[0]
            # 由所有小于基准值的元素组成
            less = [i for i in nums[1:] if i<= pivot]
            # 由所有大于基准值的元素组成
            greater = [i for i in nums[1:] if i > pivot]
            return self.quicksort(less) + [pivot] + self.quicksort(greater)

利用最小堆来获取结果

import heapq
class Solution:
    
    def findKthLargest(self, nums: List[int], k: int) -> int:
    	maxheap = [-num for num in nums]
        heapq.heapify(maxheap)
        while k-1:
            heapq.heappop(maxheap)
            k -= 1
        return -(heapq.heappop(maxheap))

利用最大堆来获取结果

using namespace std;
#include <vector>
#include <iostream>

class Solution {
public:
  void maxHeapify(vector<int>& a, int i, int heapSize) {
    // 寻找左节点与右节点
    int l = i * 2 + 1, r = i * 2 + 2, largest = i;
    // 寻找最大结点的下标,存储到largest上
    if (l < heapSize && a[l] > a[largest]) {
      largest = l;
    }
    if (r < heapSize && a[r] > a[largest]) {
      largest = r;
    }
    // 进行迭代
    if (largest != i) {
      swap(a[i], a[largest]);
      maxHeapify(a, largest, heapSize);
    }
  }
  // 建立最大堆
  void buildMaxHeap(vector<int>& a, int heapSize) {
    for (int i = heapSize / 2; i >= 0; --i) {
      maxHeapify(a, i, heapSize);
    }
  }

  // 根据最大堆来获取结果
  int findKthLargest(vector<int>& nums, int k) {
    int heapSize = nums.size();
    buildMaxHeap(nums, heapSize);
    for( int i = nums.size() - 1; i >= nums.size() - k + 1; --i) {
      swap(nums[0], nums[i]);
      --heapSize;
      maxHeapify(nums, 0 , heapSize);
    }
    return nums[0];
  }
};
int main() {
  vector<int> nums = {1,3,4,1,8,9};
  Solution heapSort;
  cout<<heapSort.findKthLargest(nums, 4)<< endl;
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值