美文网首页程序员
快排应用:数组中第K大元素

快排应用:数组中第K大元素

作者: Think_cy | 来源:发表于2020-06-21 16:08 被阅读0次

背景

学习了快排之后,主要了解了分治思想。所以在LeetCode上看到了一个经典的题目,所以尝试使用快排解决。

题目

在未排序的数组中找到第 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 ≤ 数组的长度。

图解

首先,我们选择一个参考索引,在分治实现之后,所有小于参考值的元素都在其左侧,大于的在右侧。从而将数组分成了两个部分,然后比较索引值的位置和目标索引N - k的值大小,从而确认在哪边继续递归处理。
简单总结来说:

  • 随机选择一个参考索引pIndex

  • 使用划分算法将数组pIndex放在合适的位置,将数组分成两个部分。

  • 比较pIndex和N - k决定在哪边继续递归处理。


    k_01.png

代码

 class Solution {
 public:
   int findKthLargest(vector<int>& nums, int k) {
     int leftIndex = 0;
     int rightIndex = nums.size() - 1;
     int targetIndex = nums.size() - k;
     return findKthLargest(nums, leftIndex, rightIndex, targetIndex);
   }
​
   int findKthLargest(vector<int>& nums, int leftIndex, int rightIndex, int targetIndex) {
     int i = leftIndex;
     int j = rightIndex;
     int pIndex = leftIndex;
​
     int privot = nums[pIndex];
     while (i != j) {
       while (i < j && nums[j] >= privot) {
         j--;
       }
​
       while (i < j && nums[i] <= privot) {
         i++;
       }
​
       if (i < j) {
         int tmepValue = nums[i];
         nums[i] = nums[j];
         nums[j] = tmepValue;
       }
     }

     // pIndex的值和i互换
     nums[leftIndex] = nums[i];
     nums[i] = privot;

     pIndex = i;
     if (pIndex == targetIndex) {
       return nums[pIndex]; // 找到直接返回
     } else if (pIndex > targetIndex) {
       return findKthLargest(nums, leftIndex, pIndex - 1, targetIndex);
      } else {
       return findKthLargest(nums, pIndex + 1, rightIndex, targetIndex);
     }
   }
};

复杂度分析

快排我们知道其复杂度是O(NlogN),这里我们只需要对包含N - k小的元素的那部分。所以平均时间复杂度下降到O(N)
时间复杂度:O(
N
logN)
空间复杂度:O(1)

相关文章

  • TopK问题(快排变形/优先级队列)

    1.数组中第k大/前k大的元素(215-中) 示例: 思路: 法1:快排变形:类似传统快排,区别在于,我们每次进行...

  • 数组中第K大的数

    一、相关概念 二、题目 题目 一个未排序的数组中找第k大的数 思路 快排 代码 参考文献 数组中的第K个最大元素

  • 快排应用:数组中第K大元素

    背景 学习了快排之后,主要了解了分治思想。所以在LeetCode上看到了一个经典的题目,所以尝试使用快排解决。 题...

  • 5.第K大元素

    描述在数组中找到第k大的元素。给出数组 [9,3,2,4,8],第三大的元素是 4。 Solution使用快排Pa...

  • Lua 快速排序

    快排 在一个数组中快速找出第K大的数

  • 快速选择Java实现

    快速选择算法 一、基本原理: 从一个数组中,快速找到一个排名第K大或者第K小的元素。 二、实现思路:依据快排的思路...

  • 面试算法题

    排序:选择排序,冒泡排序,快排,堆排,希尔排序 反转链表 删除链表的倒数第N个节点 数组中第K个最大元素 翻转数字...

  • 215. Kth Largest Element in an A

    利用快排的思想求解数组中第K大的元素.类似二分查找的思路,需要注意的是,划分数组的时候,需要将左边改为大于pivot的值

  • 算法分析 [最大/小值] 2019-02-28

    1. 数组,查找第k大值 215. 数组中的第K个最大元素(元素不重复无序) Kth Largest Elemen...

  • 力扣 215 数组中的第K个最大元素

    题意:给定一个数组,找到第k个最大的元素 思路:利用快速排序,快速定位第k大的元素,具体可看代码注释 思想:快速排...

网友评论

    本文标题:快排应用:数组中第K大元素

    本文链接:https://www.haomeiwen.com/subject/iuraxktx.html