力扣练习第四十天——数组中的第k个最大元素

力扣练习第四十天——数组中的第k个最大元素

题目大致如下:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例一:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例二:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
链接来源于LeetCodehttps://leetcode-cn.com/problems/kth-largest-element-in-an-array/
大致思路:
最开始想采取直接排序后返回的方式,可以采用库里的排序函数;
后面参考了一个快速排序的方法,对数组进行划分,判断划分的边界元素位置mid是否为第k大的数(k - 1)。
代码如下:

class Solution {
public:
   int findKthLargest(vector<int>& nums, int k) {
       int lo = 0, hi = nums.size() - 1, mid = 0;
       while (lo <= hi) {
           mid = partition(nums, lo, hi);
           if (mid == k - 1) return nums[mid];
           else if (mid > k - 1) hi = mid - 1;
           else lo = mid + 1;
       }
       return -1;
   }
   int partition(vector<int>& nums, int lo, int hi) {
       int  r = hi,l = lo + 1,;
       swap(nums[lo], nums[(lo + hi) / 2]);
       int bound = nums[lo];
       while (l <= r) {
           while (l < hi && nums[l] >= bound) l++;
           while (nums[r] < bound) r--;
           if (l < r) swap(nums[l++], nums[r--]);
           else break;
       }
       swap(nums[lo], nums[r]);
       return r;
   }
};

结果:
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值