1. 算法训练营实战项目解析
最近在算法训练营中遇到三个颇具挑战性的题目,分别是字符串迁移、有向图完全联通判断和海岸线计算问题。这三个题目覆盖了字符串处理、图论和几何算法等不同领域,对算法能力提出了全面考验。下面我将分享每个问题的解题思路、实现细节和优化技巧。
1.1 字符串迁移问题(卡码网110题)
字符串迁移问题要求我们对给定字符串进行特定规则的字符移动操作。具体来说,给定一个字符串s和整数k,需要将字符串的前k个字符移动到字符串末尾。
核心解法分析:
- 直接拼接法:将字符串切片后重新拼接
python复制def stringShift(s: str, k: int) -> str:
k = k % len(s) # 处理k大于字符串长度的情况
return s[k:] + s[:k]
这种方法时间复杂度O(n),空间复杂度O(n),是最直观的解决方案。
- 原地反转法(三次反转):
python复制def reverse(s: list, l: int, r: int):
while l < r:
s[l], s[r] = s[r], s[l]
l += 1
r -= 1
def stringShift(s: str, k: int) -> str:
s = list(s)
n = len(s)
k %= n
reverse(s, 0, k-1)
reverse(s, k, n-1)
reverse(s, 0, n-1)
return ''.join(s)
这种方法虽然代码量稍大,但实现了原地操作,空间复杂度优化到O(1)。
注意:当k大于字符串长度时,实际移动次数应为k%len(s),这是容易被忽略的边界条件。
1.2 有向图完全联通问题(卡码网105题)
判断有向图是否完全联通(即任意两点间都存在路径)是图论中的经典问题。这里分享两种主要解法:
解法一:Floyd-Warshall算法
python复制def isStronglyConnected(graph: List[List[int]]) -> bool:
n = len(graph)
reach = [[False]*n for _ in range(n)]
# 初始化可达矩阵
for i in range(n):
for j in range(n):
if graph[i][j] == 1:
reach[i][j] = True
# Floy
