NC88 寻找第K大
算法知识视频讲解
中等 通过率:26.47% 时间限制:3秒 空间限制:64M
知识点
堆
分治
题目
题解(62)
讨论(255)
排行
描述
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(1<=K<=n),请返回第K大的数(包括重复的元素,不用去重),保证答案存在。
示例1
输入:
[1,3,5,2,2],5,3
复制
返回值:
2
复制
示例2
输入:
[10,10,9,9,8,7,5,6,4,3,4,2],12,3
复制
返回值:
9
复制
说明:
去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9
关联企业
关联职位
思路和心得:
1.习惯上,先转化成第 (n + 1 - K)小。
2.快排
快排有3种写法。这里采用严版教材写法,左右挖坑互填
python3 代码
# -*- coding:utf-8 -*- class Solution: def findKth(self, a, n, K): # write code here kmin = n + 1 - K self.quick_sort(a, 0, n - 1, kmin) return a[kmin - 1] #--------------------------- 手撸快排(左右交换法) -----------------------# def quick_sort(self, nums, lo: int, hi: int, k: int) -> None: if lo < hi: pivot_pos = self.partition(nums, lo, hi) cur_left_len = pivot_pos - lo + 1 #当前左侧的元素个数 if cur_left_len < k: self.quick_sort(nums, pivot_pos + 1, hi, k - cur_left_len) elif cur_left_len > k: self.quick_sort(nums, lo, pivot_pos - 1, k) def partition(self, nums, lo: int, hi: int) -> int: #--------------- 严版教材。挖坑法。左右交替,左右互填 #-- 左边有坑 pivot = nums[lo] #---- 左挖坑,右填。右挖坑,左填 while lo < hi: #-- 此时左边有坑,需要找右边第一个不合理的位置去填 while lo < hi and pivot <= nums[hi]: hi -= 1 nums[lo] = nums[hi] #-- 此时右边有坑,需要找左边第一个不合理的位置去填 while lo < hi and nums[lo] <= pivot: lo += 1 nums[hi] = nums[lo] #-- 填补最初的坑 nums[lo] = pivot return lo
也可以就按照第K大。看个人习惯
c++ 代码
class Solution { public: int findKth(vector<int> a, int n, int K) { // write code here quick_sort(a, 0, n - 1, K); return a[n - K]; } //---------------------- 严版左右挖坑互填 ----------------------// void quick_sort(vector<int> & nums, int lo, int hi, int k) { if (lo < hi) { int pivot_pos = partition(nums, lo, hi); int cur_right_len = hi - pivot_pos + 1; if (cur_right_len > k) quick_sort(nums, pivot_pos + 1, hi, k); else if (cur_right_len < k) quick_sort(nums, lo, pivot_pos - 1, k - cur_right_len); } } int partition(vector<int> & nums, int lo, int hi) { int pivot = nums[lo]; while (lo < hi) { while(lo < hi && pivot <= nums[hi]) hi --; nums[lo] = nums[hi]; while (lo < hi && nums[lo] <= pivot) lo ++; nums[hi] = nums[lo]; } nums[lo] = pivot; return lo; } };
java 代码
import java.util.*; public class Solution { public int findKth(int[] a, int n, int K) { // write code here int kmin = n + 1 - K; quick_sort(a, 0, n - 1, kmin); return a[kmin - 1]; } public void quick_sort(int [] nums, int lo, int hi, int k) { if (lo < hi) { int pivot_pos = partition(nums, lo, hi); int cur_left_len = pivot_pos - lo + 1; if (cur_left_len < k) quick_sort(nums, pivot_pos + 1, hi, k - cur_left_len); else if (cur_left_len > k) quick_sort(nums, lo, pivot_pos - 1, k); } } public int partition(int [] nums, int lo, int hi) { int pivot = nums[lo]; while (lo < hi) { while (lo < hi && nums[hi] >= pivot) hi --; nums[lo] = nums[hi]; while (lo < hi && nums[lo] <= pivot) lo ++; nums[hi] = nums[lo]; } nums[lo] = pivot; return lo; } }