GitHub_Trending/le/LeetCode-Book:训练计划系列问题解题思路
你还在为刷题效率低而困扰吗?训练计划系列问题带你系统突破数据结构与算法瓶颈
读完本文你将获得
- 掌握双指针、递归、位运算等6大核心解题技巧
- 学会10+经典算法题的优化思路(时间/空间复杂度分析)
- 获取Python/Java/C++三语言实现代码模板
- 理解算法思维在实际工程问题中的应用
训练计划系列问题全景图
| 问题编号 | 核心考点 | 难度 | 出现频率 |
|---|---|---|---|
| LCR 139 | 双指针数组分区 | ⭐⭐ | 高频 |
| LCR 140 | 链表倒数节点查找 | ⭐⭐ | 高频 |
| LCR 141 | 链表反转 | ⭐⭐⭐ | 必考 |
| LCR 142 | 有序链表合并 | ⭐⭐ | 高频 |
| LCR 171 | 链表相交节点 | ⭐⭐⭐ | 常考 |
| LCR 178 | 位运算去重 | ⭐⭐⭐⭐ | 难点 |
一、数组操作:双指针技巧的极致应用(训练计划I)
问题定义
给定整数数组actions,将所有奇数移到偶数前面,保持奇数和奇数、偶数和偶数之间的相对顺序不变。
算法思路
代码实现
class Solution:
def trainingPlan(self, actions: List[int]) -> List[int]:
i, j = 0, len(actions) - 1
while i < j:
while i < j and actions[i] & 1 == 1: i += 1
while i < j and actions[j] & 1 == 0: j -= 1
actions[i], actions[j] = actions[j], actions[i]
return actions
class Solution {
public int[] trainingPlan(int[] actions) {
int i = 0, j = actions.length - 1, tmp;
while(i < j) {
while(i < j && (actions[i] & 1) == 1) i++;
while(i < j && (actions[j] & 1) == 0) j--;
tmp = actions[i];
actions[i] = actions[j];
actions[j] = tmp;
}
return actions;
}
}
复杂度分析
- 时间复杂度:O(N),双指针共遍历数组一次
- 空间复杂度:O(1),仅使用常数级额外空间
二、链表操作:快慢指针与递归思想(训练计划II-V)
2.1 寻找链表倒数第k个节点(训练计划II)
核心思路
代码实现(Python)
class Solution:
def trainingPlan(self, head: ListNode, cnt: int) -> ListNode:
former, latter = head, head
for _ in range(cnt):
former = former.next
while former:
former, latter = former.next, latter.next
return latter
2.2 链表反转(训练计划III)
迭代法(双指针)
代码实现(Java)
class Solution {
public ListNode trainningPlan(ListNode head) {
ListNode cur = head, pre = null;
while(cur != null) {
ListNode tmp = cur.next; // 暂存后继节点
cur.next = pre; // 修改next指向
pre = cur; // pre暂存cur
cur = tmp; // cur访问下一节点
}
return pre;
}
}
三、位运算高级应用:有限状态自动机(训练计划VI)
问题定义
数组actions中,除某个数字只出现一次外,其余数字都出现了三次。找出那个只出现一次的数字。
算法思路
代码实现(C++)
class Solution {
public:
int trainingPlan(vector<int>& actions) {
int ones = 0, twos = 0;
for(int action : actions){
ones = ones ^ action & ~twos;
twos = twos ^ action & ~ones;
}
return ones;
}
};
复杂度分析
- 时间复杂度:O(N),遍历数组一次
- 空间复杂度:O(1),使用两个变量存储状态
四、训练计划系列问题解题技巧总结
4.1 双指针技巧全家桶
| 应用场景 | 核心思想 | 时间复杂度优化 |
|---|---|---|
| 数组分区 | 左右指针相向移动 | O(N)单遍历 |
| 倒数节点查找 | 前后指针构建距离 | O(N)→O(1)空间 |
| 链表环检测 | 快慢指针追及 | O(N)线性时间 |
4.2 位运算实战指南
- 奇偶数判断:
x & 1(0为偶,1为奇) - 去重统计:异或运算
x ^ x = 0特性 - 状态记录:用二进制位表示多状态(如出现1次/2次)
五、实战训练路线图
结语:从解题到工程实践的思维跃迁
训练计划系列问题看似独立,实则蕴含了算法设计的通用思想:用最少的资源解决最多的问题。双指针优化空间复杂度,状态机压缩状态表示,递归降低问题规模——这些思维模式在实际工程中同样重要。
掌握这些技巧不仅能应对面试挑战,更能培养高效解决实际问题的能力。下一篇我们将深入探讨"动态规划解题框架",敬请期待!
🔍 推荐阅读
《图解算法数据结构》配套代码仓:https://gitcode.com/GitHub_Trending/le/LeetCode-Book
📌 收藏本文,随时回顾训练计划系列解题要点
👍 点赞支持,获取更多算法深度解析
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



