【LeetCode】215. 数组中的第K个最大元素

本文介绍了两种不同的算法实现来寻找一个整数数组中第k大的元素:一种基于快速排序的递归方法,另一种采用二分法。这两种方法都涉及到数组的重新排列,通过确定基准值并调整数组元素,逐步缩小搜索范围。在实际应用中,这些算法可以有效解决大数据集中的排序问题。

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

快排

我们知道 快排每次都会确定选定的中间结点位置, 也就是base 的位置会确定

class Solution {
public:

    void back (vector<int>& nums, int left, int right, int k) {
        
        if (left >= right) {
            return;
        }

        int i = left, j = right, base = nums[left], tmp = 0;
        while (i < j){
            while( nums[j] >= base && i < j ) {
                j--;
            }
            while( nums[i] <= base && i < j ) {
                i++;
            }
        

            if ( i < j ) {
                tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
            } 
        }

        

        nums[left] = nums[i];
        nums[i] = base;

        // if (i == nums.size() - k ) {
        //     return nums[i];
        // } else if (i > nums.size() - k) {
        //    return back(nums, left, i - 1, k);
        // } else { 
        //    return back(nums, i + 1, right, k);
        // } 

        back(nums, left, i - 1, k);
        back(nums, i + 1, right, k);

    }

    int findKthLargest(vector<int>& nums, int k) {
        for (auto item : nums) {
            cout << item <<" ";
        }

        cout << endl;
        back(nums, 0 , nums.size() - 1, k);

        for (auto item : nums) {
            cout << item << " " ;
        }
        cout <<endl;

        return 0;

    }
};

只需判断确定的位置是否是第 num-k 个位置就好

二分法

class Solution {
public:

    int back (vector<int>& nums, int left, int right, int k) {
        
        // if (left >= right) {
        //     return;
        // }

        int i = left, j = right, base = nums[left], tmp = 0;
      
        while (i < j){
            while( nums[j] >= base && i < j ) {
                j--;
            }
            while( nums[i] <= base && i < j ) {
                i++;
            }
        

            if ( i < j ) {
                tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
            } 
        }


        nums[left] = nums[i];
        nums[i] = base;

        if (i == nums.size() - k ) {
            return nums[i];
        } else if (i > nums.size() - k) {
           return back(nums, left, i - 1, k);
        } else { 
           return back(nums, i + 1, right, k);
        } 

       

    }

    int findKthLargest(vector<int>& nums, int k) {
        for (auto item : nums) {
            cout << item <<" ";
        }

        cout << endl;
        int m = back(nums, 0 , nums.size() - 1, k);

        for (auto item : nums) {
            cout << item << " " ;
        }
        cout <<endl;

        return m;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值