GitHub_Trending/le/LeetCode-Book:训练计划系列问题解题思路

GitHub_Trending/le/LeetCode-Book:训练计划系列问题解题思路

【免费下载链接】LeetCode-Book 《剑指 Offer》 Python, Java, C++ 解题代码,LeetBook《图解算法数据结构》配套代码仓 【免费下载链接】LeetCode-Book 项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Book

你还在为刷题效率低而困扰吗?训练计划系列问题带你系统突破数据结构与算法瓶颈

读完本文你将获得

  • 掌握双指针、递归、位运算等6大核心解题技巧
  • 学会10+经典算法题的优化思路(时间/空间复杂度分析)
  • 获取Python/Java/C++三语言实现代码模板
  • 理解算法思维在实际工程问题中的应用

训练计划系列问题全景图

问题编号核心考点难度出现频率
LCR 139双指针数组分区⭐⭐高频
LCR 140链表倒数节点查找⭐⭐高频
LCR 141链表反转⭐⭐⭐必考
LCR 142有序链表合并⭐⭐高频
LCR 171链表相交节点⭐⭐⭐常考
LCR 178位运算去重⭐⭐⭐⭐难点

一、数组操作:双指针技巧的极致应用(训练计划I)

问题定义

给定整数数组actions,将所有奇数移到偶数前面,保持奇数和奇数、偶数和偶数之间的相对顺序不变。

算法思路

mermaid

代码实现

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)

核心思路

mermaid

代码实现(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)

迭代法(双指针)

mermaid

代码实现(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中,除某个数字只出现一次外,其余数字都出现了三次。找出那个只出现一次的数字。

算法思路

mermaid

代码实现(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次)

五、实战训练路线图

mermaid

结语:从解题到工程实践的思维跃迁

训练计划系列问题看似独立,实则蕴含了算法设计的通用思想:用最少的资源解决最多的问题。双指针优化空间复杂度,状态机压缩状态表示,递归降低问题规模——这些思维模式在实际工程中同样重要。

掌握这些技巧不仅能应对面试挑战,更能培养高效解决实际问题的能力。下一篇我们将深入探讨"动态规划解题框架",敬请期待!


🔍 推荐阅读
《图解算法数据结构》配套代码仓:https://gitcode.com/GitHub_Trending/le/LeetCode-Book
📌 收藏本文,随时回顾训练计划系列解题要点
👍 点赞支持,获取更多算法深度解析

【免费下载链接】LeetCode-Book 《剑指 Offer》 Python, Java, C++ 解题代码,LeetBook《图解算法数据结构》配套代码仓 【免费下载链接】LeetCode-Book 项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Book

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值