215. Kth Largest Element in an Array

  • O(NlogN)的时间复杂度+O(1)的空间复杂度

思路:先排序,然后输出第k大的元素即可,排序的时间复杂度是O(NlogN),输出第k大元素的时间复杂度为O(1)

class Solution
{
public:
	int findKthLargest(vector<int>& nums, int k)
	{
		sort(nums.begin(), nums.end(), std::greater<>{});
		return nums[k - 1];
	}
};
  • Quick Sort 的思想

代码实现:

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

		while (true)
		{
			int pos = partition(nums, left, right);  //pos是Pivot在nums中的位置
			if (pos == k - 1)
			{
				return nums[pos];
			}
			else if (pos > k - 1)
			{
				right = pos - 1;
			}
			else
			{
				left = pos + 1;
			}
			//else if (pos > k - 1)
			//{
			//	//更新左边
			//	/*left = pos + 1;*/
			//	right = pos - 1;
			//}
			//else  //nums[pos] < nums[k - 1]
			//{
			//	//更新右边
			//	/*right = pos - 1;*/
			//	left = pos + 1;
			//}
		}
	}
private:
	int partition(vector<int>& nums, int left, int right)
	{
		int pivot = nums[left];  //选最左边一个元素作为pivot
		
		int l = left + 1;
		int r = right;

		while (l <= r)
		{
			if (nums[l] < pivot && nums[r] > pivot)
			{
				std::swap(nums[l],nums[r]);
				l++;
				r--;
			}
			if (nums[l] >= pivot)
			{
				l++;
			}
			if (nums[r] <= pivot)
			{
				r--;
			}
		}

		std::swap(nums[left],nums[r]);
		return r;
	}
};

看了第二个方法,我觉得我可能学了一个假的快排,不,我根本就没学过快排。

posted @   尚修能的技术博客  阅读(136)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
点击右上角即可分享
微信分享提示