
双指针技巧大揭秘LintCode 20道经典数组题的C11实现清单【免费下载链接】LintCode C11 Solutions of All 289 LintCode Problems (No More Updates)项目地址: https://gitcode.com/gh_mirrors/lintc/LintCode在 LintCode 题库中双指针Two Pointers是解数组题最高效的技巧之一。开源项目LintCode收录了全部 289 道 LintCode 题目的 C11 解法并按算法分类整理其中标记为 Two Pointers 的经典数组题就有 20 道。本文带你用一份完整清单快速掌握双指针在排序、去重、合并、窗口扫描中的实战用法 项目简介一份免费的 C11 刷题宝库本项目提供了LintCode 全部 289 道题的 C11 标准答案每题都标注了时间复杂度、空间复杂度与难度等级所有源码按算法分类存放在 C/ 目录下另有少量 Python/ 与 Java/ 对照实现。你可以直接克隆仓库来学习git clone https://gitcode.com/gh_mirrors/lintc/LintCode 为什么推荐这里练双指针✅ 每题都给出最优复杂度例如 O(n) 时间 O(1) 空间✅ 代码风格统一、注释简洁适合新手逐行精读✅ 按 README.md 中的分类索引一眼定位到目标题目 双指针技巧3 种核心变化双指针的本质是让两个游标协同移动把两层循环压缩成一层。常见有 3 种变化变化形态典型场景本项目代表题 快慢指针同一方向原地去重、移除元素Remove Element、Move Zeroes 左右指针对向移动求区间、求极值Container With Most Water、Trapping Rain Water 滑动窗口同向伸缩子数组和/长度约束Minimum Size Subarray Sum、Subarray Sum II 20 道双指针经典数组题完整清单以下清单来自项目 README.md 中标注Two Pointers的题目全部附 C11 源码路径难度与复杂度一目了然1️⃣ 基础快慢指针去重与移除5 道#题目难度复杂度源码100Remove Duplicates from Sorted ArrayEasyO(n) / O(1)C/remove-duplicates-from-sorted-array.cpp101Remove Duplicates from Sorted Array IIEasyO(n) / O(1)C/remove-duplicates-from-sorted-array-ii.cpp172Remove ElementEasyO(n) / O(1)C/remove-element.cpp539Move ZeroesEasyO(n) / O(1)C/move-zeroes.cpp5Kth Largest ElementMediumO(n) 平均C/kth-largest-element.cpp核心口诀慢指针pos标记有效区末尾快指针扫描全数组遇到符合条件的元素就交换或写入。C/move-zeroes.cpp 中的实现只有 8 行是理解快慢指针的最佳入门样例。2️⃣ 分区与排序技巧4 道#题目难度复杂度源码31Partition ArrayMediumO(n) / O(1)C/partition-array.cpp373Partition Array by Odd and EvenEasyO(n) / O(1)C/partition-array-by-odd-and-even.cpp49Sort Letters by CaseMediumO(n) / O(1)C/sort-letters-by-case.cpp144Interleaving Positive and Negative NumbersMediumO(n) / O(1)C/interleaving-positive-and-negative-numbers.cpp 分区题的双指针 双向奔赴左指针找放错位置的元素右指针同理相遇即完成。3️⃣ 合并与交并有序数组的左指针右指针4 道#题目难度复杂度源码6Merge Sorted ArrayEasyO(mn) / O(1)C/merge-sorted-array.cpp64Merge Sorted Array IIEasyO(mn) / O(1)C/merge-sorted-array-ii.cpp547Intersection of Two ArraysEasyO(mn)C/intersection-of-two-arrays.cpp548Intersection of Two Arrays IIEasyO(mn)C/intersection-of-two-arrays-ii.cpp关键细节合并数组要从后往前写避免覆盖未处理的数据求交集时小者右移是双指针在两个独立数组上的经典配合。4️⃣ 排序双指针多数字求和与计数3 道#题目难度复杂度源码573 SumMediumO(n²) / O(1)C/3-sum.cpp593 Sum ClosestMediumO(n²) / O(1)C/3-sum-closest.cpp382Triangle CountMediumO(n²) / O(1)C/triangle-count.cpp模板套路先排序固定一个数剩下两个数用左右指针夹逼。C/3-sum.cpp 中还示范了跳过重复值去重的标准写法面试高频考点 5️⃣ 进阶压轴左右指针的数学美感4 道#题目难度复杂度源码363Trapping Rain WaterMediumO(n) / O(1)C/trapping-rain-water.cpp383Container With Most WaterMediumO(n) / O(1)C/container-with-most-water.cpp406Minimum Size Subarray SumMediumO(n) / O(1)C/minimum-size-subarray-sum.cpp404Subarray Sum IIHardO(nlogn) / O(n)C/subarray-sum-ii.cpp这几道题最能体现双指针的威力。以盛最多水的容器为例源码仅 20 行int i 0, j heights.size() - 1, max_area 0; while (i j) { max_area max(max_area, min(heights[i], heights[j]) * (j - i)); if (heights[i] heights[j]) { --j; } else if (heights[i] heights[j]) { i; } else { i, --j; } }来源C/container-with-most-water.cpp思路每次移动较矮的一侧因为宽度必然变小只有加高才可能获得更大面积——这就是贪心双指针的精髓。而 C/trapping-rain-water.cpp 更妙左右指针各维护一个侧边最高墙谁矮看谁一次扫描 O(n) 就算出总蓄水量连前缀数组都不需要。 新手学习路线建议第 1 周先刷「去重与移除」组Remove Element → Move Zeroes建立快慢指针手感第 2 周合并与交集组练习有序数组上的指针移动第 3 周3 Sum / Triangle Count 组掌握排序 夹逼模板第 4 周挑战 Trapping Rain Water、Container With Most Water理解移动指针的数学依据每道题对照 README.md 中的复杂度表格自查能否做到 O(n) 时间、O(1) 空间做不到就回看源码注释那里往往藏着关键的 invariant不变量。✨ 总结双指针不是玄学而是一套可以照抄的模板快慢指针处理原地修改左右指针处理区间极值滑动窗口处理子数组约束。本项目的 20 道双指针经典数组题按难度梯度排列配合统一风格的 C11 实现正是把这套模板练成肌肉记忆的最佳路径。克隆仓库、打开 C/ 目录今天就从 C/remove-element.cpp 开始吧 【免费下载链接】LintCode C11 Solutions of All 289 LintCode Problems (No More Updates)项目地址: https://gitcode.com/gh_mirrors/lintc/LintCode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考