LeetCode刷题_215:数组中的第K个最大元素【C++】

本文介绍了一种使用快速排序算法解决寻找数组中第k个最大元素问题的方法。通过具体的代码实现,展示了如何通过分区函数确保左侧元素小于基准,右侧元素大于基准,从而有效地找出目标元素。

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

题目描述

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4]k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6]k = 4
输出: 4

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度

答案代码

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        if(k > nums.size())
            return 0;
        k = nums.size() - k;

        quicksort(nums,0,nums.size()-1);
        return nums[k];

    }

public:
    void quicksort(vector<int>& arr,int l, int r){
        if(l >= r)
            return ;
        int mid;
        mid = partition(arr ,l ,r);
        quicksort(arr,l,mid-1);
        quicksort(arr,mid+1,r);
    }

public:
    //关键的划分函数,保证左边都比key小,右边都比key大
    int partition(vector<int>& arr, int l ,int r){
      int  v = arr[l];//基准设为第一个元素

      //arr[l+1...j] < v arr[j+1 ... r] > v
      int j = l;
      for(int i = l + 1; i <= r; i++){ //此处一定要理解,为什么是从l + 1开始,因为我们要要维护arr[l+1...j] < v这个循环不变量。
          if(arr[i] < v){
              swap(arr[++j],arr[i]);
          }
      }
      swap(arr[l],arr[j]);
        return  j;
    }

};

测试代码

#include <iostream>
#include <vector>

using namespace std;
//利用快速排序思想

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        if(k > nums.size())
            return 0;
        k = nums.size() - k;

        quicksort(nums,0,nums.size()-1);
        return nums[k];

    }

public:
    void quicksort(vector<int>& arr,int l, int r){
        if(l >= r)
            return ;
        int mid;
        mid = partition(arr ,l ,r);
        quicksort(arr,l,mid-1);
        quicksort(arr,mid+1,r);
    }

public:
    //关键的划分函数,保证左边都比key小,右边都比key大
    int partition(vector<int>& arr, int l ,int r){
      int  v = arr[l];//基准设为第一个元素

      //arr[l+1...j] < v arr[j+1 ... r] > v
      int j = l;
      for(int i = l + 1; i <= r; i++){ //此处一定要理解,为什么是从l + 1开始,因为我们要要维护arr[l+1...j] < v这个循环不变量。
          if(arr[i] < v){
              swap(arr[++j],arr[i]);
          }
      }
      swap(arr[l],arr[j]);
        return  j;
    }

};

int main() {
    int n;
    cin>>n;
    int arr[n];
    for(int i = 0; i < n; i++)
        cin>>arr[i];
    vector<int> vec(arr,arr+ sizeof(arr)/ sizeof(int));
    cout<<Solution().findKthLargest(vec,n-1)<<endl;
    return 0;
}
这就是强者的世界吗?

欢迎讨论,一起刷题,一起前往强者的世界。优快云@anchuanxu 折剑山庄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值