Leetcode精选50题-Day14
215 数组中的第K个最大元素
1. 题目描述
2. 思路&代码
排序总结,写的特好:xiao-xie-shui-bu-xing
# 堆排序的思想
#可借助python中的heapq模块实现堆的功能, 注意建立的是小根堆
class Solution1:
def findKthLargest(self, nums: List[int], k: int) -> int:
import heapq as hq
heap = []
for i in nums:
hq.heappush(heap, i)
if len(heap) > k:
hq.heappop(heap)
return heap[0]
# 自己实现堆
class Solution2:
def findKthLargest(self, nums: List[int], k: int) -> int:
n = len(nums)
heap = nums[:k]
# 建立含k个元素的小根堆
for i in range((k-2)//2, -1, -1):
self.sift(heap, i, k-1)
#若k之后的元素大于根节点,则将该元素与根节点替换,然后做一次调整
for j in range(k,n):
if nums[j] > heap[0]: #找前k大的数
heap[0] = nums[j]
self.sift(heap, 0 , k-1)
# print(heap)
return heap[0] #堆顶就是第k大的数了
# 注意这里要建立小根堆
def sift(self, alist, low, high):
# 假设只有根节点需要调整,两棵子树都是堆
i = low
j = i *2 +1 #j指向i的左子树
tmp = alist[i]
while j <=high:
if j+1<= high and alist[j] > alist[j+1]: #右子树比较小,则指向右子树
j = j+1
if alist[j] < tmp: # 若子树的值比较小,则根节点换成子树,然后向下看一层
alist[i] = alist[j]
i = j
j = i *2 +1
else:
alist[i] = tmp # 子树的值大于根节点,则根节点就放在这一层
break
else:
alist[i] = tmp # j越界跳出循环,则把根节点放在叶子节点
217 存在重复元素
1. 题目描述
2. 思路&代码
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
temp = set(nums)
if len(temp) == len(nums):
return False
else:
return True
230 二叉搜索树中第K小的元素
1. 题目描述
2. 思路&代码
class Solution:
def kthSmallest(self, root, k):
"""
:type root: TreeNode
:type k: int
:rtype: int
"""
def inorder(r):
return inorder(r.left) + [r.val] + inorder(r.right) if r else []
return inorder(root)[k - 1]