Day14
215. 数组中的第K个最大元素 (Medium)
"""
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
"""
from typing import List
class Solution(object):
def findKthLargest(self, nums: List[int], k: int) -> int:
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
# return sorted(nums)[-k]
l = [x for x in nums if x > nums[0]]
m = [x for x in nums if x == nums[0]]
r = [x for x in nums if x < nums[0]]
f = self.findKthLargest
if k <= len(l):
return f(l, k)
elif k <= len(l) + len(m):
return nums[0]
return f(r, k - len(l) - len(m))
217. 存在重复元素 (Easy)
"""
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
示例 1:
输入: [1,2,3,1]
输出: true
示例 2:
输入: [1,2,3,4]
输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
"""
from typing import List
class Solution(object):
def containsDuplicate(self, nums: List[int]) -> bool:
"""
:type nums: List[int]
:rtype: bool
"""
return len(nums) != len(set(nums))
230. 二叉搜索树中第K小的元素 (Medium)
"""
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 1
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 3
进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?
"""
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution(object):
def kthSmallest(self, root: TreeNode, k: int) -> int:
"""
:type root: TreeNode
:type k: int
:rtype: int
"""
res = []
self.visitNode(root, res)
return res[k - 1]
# 中序遍历
def visitNode(self, root, res):
if root is None:
return
self.visitNode(root.left, res)
res.append(root.val)
self.visitNode(root.right, res)
参考资料