返回
LeetCode每日一题:326、200、230秒杀,33天完美通关!
前端
2023-11-12 08:37:12
- 3的幂
题目
给定一个整数,写一个函数来判断它是否是3的幂。
解题思路
这道题目的本质是判断一个整数是否可以表示为3^n
的形式,其中n
为非负整数。我们可以使用以下步骤来解决这个问题:
- 特判: 如果给定的整数为0,则它不是3的幂。
- 循环判断: 不断地将给定的整数除以3,直到它不能再被3整除。
- 检查余数: 如果在循环过程中,给定的整数不能再被3整除,并且余数为0,则它是一个3的幂。否则,它不是3的幂。
代码实现
def isPowerOfThree(n):
# 特判
if n == 0:
return False
# 循环判断
while n % 3 == 0:
n //= 3
# 检查余数
return n == 1
200. 岛屿数量
题目
给定一个由0
和1
组成的二维网格,其中0
表示水域,1
表示陆地,找出网格中岛屿的数量。
解题思路
这道题目的本质是求解连通分量的个数。我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决这个问题。这里,我们采用DFS的解法:
- 遍历网格: 逐行遍历网格,如果遇到
1
,则表示遇到了一个岛屿。 - 深度优先搜索: 从该
1
出发,向上下左右四个方向进行深度优先搜索,将与该1
相连的所有1
都标记为0
。 - 计数岛屿: 每当完成一次深度优先搜索,就将岛屿数量加1。
代码实现
def numIslands(grid):
# 异常处理
if not grid or not grid[0]:
return 0
# 行数和列数
m, n = len(grid), len(grid[0])
# 岛屿数量
count = 0
# 深度优先搜索
def dfs(x, y):
# 越界或为水域
if x < 0 or x >= m or y < 0 or y >= n or grid[x][y] == 0:
return
# 标记为已访问
grid[x][y] = 0
# 向上下左右四个方向搜索
dfs(x - 1, y)
dfs(x + 1, y)
dfs(x, y - 1)
dfs(x, y + 1)
# 遍历网格
for i in range(m):
for j in range(n):
# 遇到岛屿
if grid[i][j] == 1:
# 深度优先搜索
dfs(i, j)
# 计数岛屿
count += 1
return count
230. 二叉搜索树中第K小的元素
题目描述
给定一个二叉搜索树,找出其中第k
小的元素。
解题思路
这道题目的本质是求解二叉搜索树的中序遍历结果的第k
个元素。我们可以使用中序遍历来解决这个问题:
- 中序遍历: 按照左-根-右的顺序遍历二叉搜索树,并将遍历到的元素存储在一个列表中。
- 获取第k个元素: 返回列表中第
k
个元素,即为二叉搜索树中第k
小的元素。
代码实现
def kthSmallest(root, k):
# 中序遍历
stack = []
while root or stack:
# 遍历到最左边的叶子节点
while root:
stack.append(root)
root = root.left
# 弹出栈顶元素
root = stack.pop()
# 计数
k -= 1
if k == 0:
return root.val
# 遍历右子树
root = root.right
总结
在本文中,我们详细地介绍了LeetCode上的326、200、230这三道题目,并给出了每道题目的详细解法和代码实现。通过这三道题目的学习,我们进一步巩固了对深度优先搜索、广度优先搜索和中序遍历等算法技巧的理解。希望大家能够熟练掌握这些算法技巧,在LeetCode的解题道路上取得更大的进步!