题目描述
有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。
给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。
要求:时间复杂度
O
(
n
l
o
g
n
)
O
(
n
l
o
g
n
)
O(nlogn)O(nlogn)
O(nlogn)O(nlogn),空间复杂度
O
(
1
)
O
(
1
)
O(1)O(1)
O(1)O(1)
数据范围:
0
≤
n
≤
10000
≤
n
≤
1000
0\le n \le 10000≤n≤1000
0≤n≤10000≤n≤1000,
1
≤
K
≤
n
1
≤
K
≤
n
1 \le K \le n1≤K≤n
1≤K≤n1≤K≤n,数组中每个元素满足
0
≤
v
a
l
≤
100000000
≤
v
a
l
≤
10000000
0 \le val \le 100000000≤val≤10000000
0≤val≤100000000≤val≤10000000
题解一:应用冒泡排序
思路:因为要找到第K个大的数,所以从小到大排序,只要排好后面K个数就行了(即只用排K轮),用冒泡排序将前K个数排好,然后取出arr[arr.length-K]
。能通过,不过不符合题目时间复杂度的要求
我犯的错误:
- 冒泡排序的思想是每次把最大或者最小的值放到最后面,所以不是说排好前
arr
中前K个数,而是排好后K个数- 我曾经分析过使用冒泡排序对一个长度为n的数组,进行排序,需要n-1轮。为什么这里排好后K(K<=n)个数,需要K轮呢?因为对一整个数组排完n-1轮时,只剩下一个排在0位的元素了,不用对最后一个排序,实际上是要排n轮的。
js
代码
function findKth( a , n , K ) {
// write code here
bubbleSort(a, n, K)
return a[n-K]
}
function bubbleSort(arr, len, k){
for(let i=1; i<=k; i++){
for(let j=0; j<len-i; j++){
if(arr[j] > arr[j+1]){
const tmp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = tmp
}
}
}
}
module.exports = {
findKth : findKth
};
题解二:arr.sort()
代码:
function findKth( a , n , K ) {
// 不传处理函数的话,按照字典顺序进行排列
a.sort((x, y) => {
return x - y
})
return a[n-K]
}
module.exports = {
findKth : findKth
};