FindKthLargest

找到第K大的数

思路

在这里我主要用了快速排序的思想,但是效率高的前提是尽量确保原数组的无序和随机性。否则快速排序的复杂度会提高到O(n^2)

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

Set the startIndex = 0 and the endIndex = nums.size()-1;

因为我们假设了快速排序是ascending order,所以 k = nums.size()-k; (reverse the k;倒数第K个元素)

我们设置pivot value 为nums[startIndex] 并且初始化两个游标cursors:left = startIndex+1 & right = endIndex 。通过快速排序的方法,顺利找到 pivot value 应该在的索引位置,最后开始判断,如果此时的索引位置等于k,那么可以直接返回k索引的元素值;如果大于或小于k值那么开始进行下一轮的递归。

实现

class solution{
  public:
  				int findKthLargest(vector<int>& nums int k)
          {
            int start = 0, end = nums.size()-1, k = nums.size()-k;
            return _findKthLargest(nums,k,start,end);
          }
  private:
  				int _findKthLargest(vector<int>& nums,int k, int start,int end)
          {
            //检验start 和 end 的合法性
            if (start <= end)
            {
              int pivotVal = nums[start];
              int left = start+1;
              int right  = end;
              //快速排序
              while (true)
              {
                while(left <= end && nums[left]< pivot) left ++;
                while(right >= start+1 && nums[right]> pivot) right--;
                if (left > right) break;
                swap(nums[left++],nums[right--]);
              }
              swap(nums[start],nums[right]);
              //如果 right = k 那个直接返回元素
              if(right == k) return nums[k];
              else if(right > k) 
              {
                return _findLthLargest(nums,k,start, right-1);
              }
              else 
              {
                return _findKthLargest(nums,k,right+1,end);
              }
            }
            return -1;
          }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用快速排序算法来解决这个问题。快速排序是一种常见的排序算法,它可以通过将数组分割成两个子数组递归地进行排序。在这个问题中,我们可以使用快速排序来找到第k大的元素。 首先,我们需要编写一个辅助函数partition,它将根据快速排序的原理将数组分割成两个子数组。该函数选择一个基准值(可以选择数组的第一个元素),并将比基准值大的元素放在基准值的右边,比基准值小的元素放在基准值的左边。然后返回基准值的索引。 接下来,我们可以使用递归来实现快速排序算法。每次递归调用partition函数,将数组分成两个子数组,然后根据基准值的索引来确定第k大的元素在哪个子数组中。如果基准值的索引等于k-1,那么就找到了第k大的元素;如果基准值的索引大于k-1,那么第k大的元素在基准值的左边;如果基准值的索引小于k-1,那么第k大的元素在基准值的右边。根据这个规律,我们可以使用递归来不断缩小搜索范围,直到找到第k大的元素。 下面是用C语言实现的代码: ```c int partition(int* nums, int left, int right) { int pivot = nums[left]; int i = left + 1; int j = right; while (i <= j) { if (nums[i < pivot && nums[j > pivot) { int temp = nums[i]; nums[i = nums[j]; nums[j = temp; i++; j--; } if (nums[i >= pivot) { i++; } if (nums[j <= pivot) { j--; } } int temp = nums[left]; nums[left = nums[j]; nums[j = temp; return j; } int findKthLargest(int* nums, int numsSize, int k) { int left = 0; int right = numsSize - 1; while (1) { int pivotIndex = partition(nums, left, right); if (pivotIndex == k - 1) { return nums[pivotIndex]; } else if (pivotIndex < k - 1) { left = pivotIndex + 1; } else { right = pivotIndex - 1; } } } ``` 这段代码首先定义了一个辅助函数partition来进行数组分割。然后在findKthLargest函数中使用快速排序算法来找到第k大的元素。最后,返回第k大的元素即可。 希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值