方法一:冒泡方法,循环K次,找到第K大的值,鉴于这种方法比较low,就不介绍了
方法二:Java实现,用优先队列(堆)实现,这种确实比较简单,感觉应用了较复杂的数据结构不太爽
public class KthLargestElementinanArray {
public int findKthLargest1(int[] nums, int k) {
// 记住这种数据结构(优先队列,也是小顶堆)
PriorityQueue<Integer> p = new PriorityQueue<Integer>();
for(int i = 0 ; i < nums.length; i++){
p.add(nums[i]);
if(p.size()>k)
p.poll();
}
return p.poll();
}
}
方法三:Python实现,用快速排序的思想,这种感觉比较好使,我比较喜欢
class Solution(object):
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
if k > len(nums):
return
return self.quickSort(nums,0,len(nums) - 1,k)
def quickSort(self,nums,left,right,k):
if left <= right:
begin = left
end = right
keyValue = nums[begin]
while begin < end:
# 从右边开始找到第一个比keyValue大的值
while begin < end and nums[end] < keyValue:
end -= 1
# 这里必须做判断,如果使用else则会出错
if begin < end:
nums[begin] = nums[end]
begin += 1
# 从左边开始找到第一个小于等于keyValue的值
while begin < end and nums[begin] > keyValue:
begin += 1
if begin < end:
nums[end] = nums[begin]
end -= 1
nums[begin] = keyValue
if begin + 1 > k:
return self.quickSort(nums,left,begin - 1,k)
elif begin + 1 < k:
# 找到下标是k - 1就行
return self.quickSort(nums,begin + 1,right,k)
else:
return nums[begin]