LeetCode Devide & Conquer problem || Kth Largest Element in an Array

本文介绍了一种在未排序数组中查找第K大元素的方法,包括使用快速排序和堆排序两种算法实现。通过分治策略,如快速排序,以及利用堆的数据结构特性,可以有效地解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
example:
Given [3,2,1,5,6,4] and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array’s length.
Difficulty:
medium

解题思路

如果不考虑题目tag,这道题非常简单,直接用sort函数将序列排序,返回第K大的元素即可,easy.

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        int kmax = nums[nums.size() - k];
        return kmax;
    }
};

考虑题目Tag中Divide and Conquer的要求,则需要自己写一个分治算法对序列进行排序了。排序算法中最经典的分治算法,就是快排(Quick Sort)了。
快排的基本思想是任取待排序对象序列中的某个对象(例如第一个对象)作为枢轴(pivot),按照该对象的关键字大小,将整个对象划分为左右两个子序列:

  • 左侧子序列中所有对象的关键字都小于或等于枢轴对象的关键字;
  • 右侧子序列中所有对象的关键字都大于枢轴对象的关键字;

枢轴对象则排在这两个子序列中间(这也是该对象最终应安放的位置)。
然后分别对这两个子序列重复实施上述方法,直到所有对象都排在相应的位置上为止。

class Solution {
public:
    int partition(vector<int>& list, int low, int high){
        int pivot = list[low];
        while(low < high){
            while(low < high && list[high] >= pivot) high--;
            list[low] = list[high];
            while(low < high && list[low] <= pivot) low++;
            list[high] = list[low];
        }
        list[low] = pivot;
        return low;
    }
    void quickSort(vector<int> &list, int low, int high){
        if(low < high){
            int pivot = partition(list, low, high);
            quickSort(list, low, pivot - 1);
            quickSort(list, pivot + 1, high);
        }
    }
    int findKthLargest(vector<int>& nums, int k) {
        quickSort(nums, 0, nums.size() - 1);
        int kmax = nums[nums.size() - k];
        return kmax;
    }
};

然而题目还给了另一个提示Tag:Heap,先占一个Tag,以后用堆排序完成排序后再来补充完整(●ˇ∀ˇ●)~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值