Skip to content

Commit 488e397

Browse files
committed
复习
1 parent 2550adb commit 488e397

4 files changed

+158
-0
lines changed

110. 平衡二叉树.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# 给定一个二叉树,判断它是否是高度平衡的二叉树。
2+
# 本题中,一棵高度平衡二叉树定义为:
3+
# 一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。
4+
#
5+
# 示例 1:
6+
# 输入:root = [3,9,20,null,null,15,7]
7+
# 输出:true
8+
#
9+
# 示例 2:
10+
# 输入:root = [1,2,2,3,3,null,null,4,4]
11+
# 输出:false
12+
#
13+
# 示例 3:
14+
# 输入:root = []
15+
# 输出:true
16+
#
17+
# 提示:
18+
# 树中的节点数在范围 [0, 5000] 内
19+
# -104 <= Node.val <= 104
20+
21+
# Definition for a binary tree node.
22+
class TreeNode:
23+
def __init__(self, val=0, left=None, right=None):
24+
self.val = val
25+
self.left = left
26+
self.right = right
27+
28+
29+
class Solution:
30+
def isBalanced(self, root: TreeNode) -> bool:
31+
def dfs(node: TreeNode) -> int:
32+
if node is None:
33+
return 0
34+
l, r = dfs(node.left), dfs(node.right)
35+
if l == -1 or r == -1 or abs(l - r) > 1:
36+
return -1
37+
return max(l, r) + 1
38+
39+
return dfs(root) != -1

141. 环形链表.py

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# 给定一个链表,判断链表中是否有环。
2+
#
3+
# 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
4+
# 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置
5+
# (索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
6+
# 注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
7+
# 如果链表中存在环,则返回 true 。 否则,返回 false 。
8+
#
9+
# 进阶:
10+
# 你能用 O(1)(即,常量)内存解决此问题吗?
11+
#
12+
# 示例 1:
13+
# 输入:head = [3,2,0,-4], pos = 1
14+
# 输出:true
15+
# 解释:链表中有一个环,其尾部连接到第二个节点。
16+
#
17+
# 示例 2:
18+
# 输入:head = [1,2], pos = 0
19+
# 输出:true
20+
# 解释:链表中有一个环,其尾部连接到第一个节点。
21+
#
22+
# 示例 3:
23+
# 输入:head = [1], pos = -1
24+
# 输出:false
25+
# 解释:链表中没有环。
26+
#
27+
# 提示:
28+
# 链表中节点的数目范围是 [0, 104]
29+
# -105 <= Node.val <= 105
30+
# pos 为 -1 或者链表中的一个 有效索引 。
31+
# Definition for singly-linked list.
32+
# class ListNode:
33+
# def __init__(self, x):
34+
# self.val = x
35+
# self.next = None
36+
37+
class Solution:
38+
def hasCycle(self, head: ListNode) -> bool:
39+
if head is None or head.next is None:
40+
return False
41+
slow, fast = head, head.next
42+
while slow != fast:
43+
if fast is None or fast.next is None:
44+
return False
45+
slow = slow.next
46+
fast = fast.next.next
47+
return True

33. 搜索旋转排序数组.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 整数数组 nums 按升序排列,数组中的值互不相同 。
2+
# 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,
3+
# 使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
4+
# (下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]。
5+
#
6+
# 给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,
7+
# 则返回它的下标,否则返回 -1。
8+
#
9+
# 示例 1:
10+
# 输入:nums = [4,5,6,7,0,1,2], target = 0
11+
# 输出:4
12+
#
13+
# 示例 2:
14+
# 输入:nums = [4,5,6,7,0,1,2], target = 3
15+
# 输出:-1
16+
#
17+
# 示例 3:
18+
# 输入:nums = [1], target = 0
19+
# 输出:-1
20+
#
21+
# 提示:
22+
# 1 <= nums.length <= 5000
23+
# -10^4 <= nums[i] <= 10^4
24+
# nums 中的每个值都 独一无二
25+
# 题目数据保证 nums 在预先未知的某个下标上进行了旋转
26+
# -10^4 <= target <= 10^4
27+
28+
# 进阶:你可以设计一个时间复杂度为 O(log n) 的解决方案吗?
29+
class Solution:
30+
def search(self, nums: List[int], target: int) -> int:
31+
l, r = 0, len(nums) - 1
32+
while l < r:
33+
mid = (l + r) // 2
34+
if nums[l] <= target <= nums[mid] or target <= nums[mid] < nums[r] or nums[mid] < nums[l] <= target:
35+
r = mid
36+
else:
37+
l = mid + 1
38+
return l if nums[l] == target else -1

347. 前 K 个高频元素.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。
2+
# 你可以按 任意顺序 返回答案。
3+
#
4+
# 示例 1:
5+
# 输入: nums = [1,1,1,2,2,3], k = 2
6+
# 输出: [1,2]
7+
#
8+
# 示例 2:
9+
# 输入: nums = [1], k = 1
10+
# 输出: [1]
11+
#
12+
# 提示:
13+
# 1 <= nums.length <= 105
14+
# k 的取值范围是 [1, 数组中不相同的元素的个数]
15+
# 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
16+
#
17+
# 进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。
18+
19+
class Solution:
20+
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
21+
cnt_m = {}
22+
for num in nums:
23+
if num not in cnt_m:
24+
cnt_m[num] = 0
25+
cnt_m[num] += 1
26+
27+
li = []
28+
heapq.heapify(li)
29+
for cnt, e in cnt_m.items():
30+
if len(li) < k:
31+
heapq.heappush(li, (e, cnt))
32+
else:
33+
heapq.heappushpop(li, (e, cnt))
34+
return [e for _, e in li]

0 commit comments

Comments
 (0)