├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── others.md │ └── translate.md ├── .gitignore ├── README.md ├── contributor.jpg ├── pictures ├── 4keyboard │ ├── 1.jpg │ └── title.png ├── BST │ ├── BST_example.png │ ├── bst_deletion_case_1.png │ ├── bst_deletion_case_2.png │ ├── bst_deletion_case_3.png │ └── 假BST.png ├── Chrome插件 │ ├── baidumonkey.png │ ├── baidu广告.png │ ├── csdnBlock.png │ ├── githubzip.png │ ├── listen1.png │ ├── monkey.png │ ├── oneTab.png │ ├── pin.png │ ├── tree.png │ └── youhou优化.png ├── LCS │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── dp.png │ └── lcs.png ├── LRU算法 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ └── put.jpg ├── algo4 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ └── title.png ├── backtrack │ ├── ink-image (1).png │ ├── ink-image (2).png │ ├── ink-image (3).png │ ├── ink-image (4).png │ ├── ink-image (5).png │ ├── ink-image (6).png │ ├── ink-image.png │ ├── nqueens.png │ ├── permutation.png │ ├── 代码.png │ ├── 代码1.png │ ├── 代码2.png │ ├── 代码3.png │ └── 全排列.png ├── backtracking │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ └── 7.jpg ├── calculator │ ├── 1.1.jpg │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ └── 6.jpg ├── dupmissing │ ├── 1.gif │ ├── 2.jpg │ └── 3.jpg ├── editDistance │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── delete.gif │ ├── dp.jpg │ ├── edit.gif │ ├── insert.gif │ ├── replace.gif │ └── title.png ├── floodfill │ ├── floodfill.gif │ ├── floodfill.png │ ├── leetcode.png │ ├── ppt1.PNG │ ├── ppt2.PNG │ ├── ppt3.PNG │ ├── ppt4.PNG │ ├── ppt5.PNG │ ├── xiaoxiaole.jpg │ ├── 扫雷.png │ ├── 抠图.jpeg │ └── 抠图.jpg ├── group.jpg ├── header.jpg ├── heap │ ├── 1.png │ ├── delete.gif │ ├── insert.gif │ ├── sink.gif │ └── swim.gif ├── intersection │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.gif │ └── title.png ├── interval │ ├── 1.gif │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── title1.png │ └── title2.png ├── kgroup │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.gif │ └── title.png ├── kmp │ ├── 1.gif │ ├── 2.gif │ ├── 3.gif │ ├── A.gif │ ├── allstate.jpg │ ├── back.jpg │ ├── dfa.gif │ ├── exp1.jpg │ ├── exp2.jpg │ ├── exp3.jpg │ ├── exp4.jpg │ ├── exp5.jpg │ ├── exp6.jpg │ ├── exp7.jpg │ ├── forward.jpg │ ├── kmp.gif │ ├── shadow.jpg │ ├── shadow1.jpg │ ├── shadow2.jpg │ ├── state.jpg │ ├── state2.jpg │ ├── state4.jpg │ ├── txt1.jpg │ ├── txt2.jpg │ ├── txt3.jpg │ ├── txt4.jpg │ └── z.jpg ├── labuladong.jpg ├── labuladong.png ├── linux-fs │ ├── application.png │ ├── apt.png │ ├── bin.png │ ├── boot.png │ ├── cpu.png │ ├── desktop.png │ ├── dev.png │ ├── etc.png │ ├── home.png │ ├── linux-filesystem.png │ ├── log.png │ ├── opt.png │ ├── proc.png │ ├── root.png │ ├── sbin.png │ ├── tmp.png │ ├── usr.png │ └── usrbin.png ├── linuxProcess │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ └── 8.jpg ├── linuxshell │ └── 1.png ├── mergeInterval │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.gif │ └── title.png ├── online │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── others │ └── leetcode.jpeg ├── pancakeSort │ ├── 1.jpg │ ├── 2.png │ ├── 3.jpg │ ├── 4.jpg │ └── title.png ├── pay.jpg ├── prime │ └── 1.gif ├── qrcode.jpg ├── redis入侵 │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ └── 6.png ├── result.jpg ├── robber │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── title.png │ └── title1.png ├── session │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.jpg ├── souyisou.png ├── table_qr2.jpg ├── unionfind │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ └── 9.gif ├── unionfind应用 │ ├── 1.jpg │ ├── 2.jpg │ └── 3.jpg ├── youtube │ ├── 1.png │ ├── 1573133096614.jpeg │ ├── 1573133131308.jpeg │ ├── 2.jpg │ ├── 3.jpg │ └── 4.jpg ├── 二分应用 │ ├── title1.png │ └── title2.png ├── 二分查找 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── binarySearch1.png │ ├── binarySearch2.png │ └── poem.png ├── 位操作 │ ├── 1.png │ └── title.png ├── 信封嵌套 │ ├── 0.jpg │ ├── 1.jpg │ ├── 2.jpg │ └── title.png ├── 前缀和 │ ├── 1.jpg │ ├── 2.jpg │ └── title.png ├── 动态规划详解 │ ├── coindp.png │ ├── coinfunc.png │ ├── cointree.png │ ├── fibdp.png │ ├── fibfunc.png │ ├── fibmemo.png │ ├── fibtree.png │ ├── img_20190514_013033.441.png │ ├── img_20190514_013830.397.png │ ├── ink-image (1).png │ ├── ink-image (2).png │ ├── ink-image (3).png │ ├── ink-image (4).png │ └── ink-image.png ├── 动态规划详解进阶 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── coin.png │ └── fib.png ├── 单调栈 │ ├── 1.png │ ├── 2.png │ └── 3.png ├── 单调队列 │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── title.png ├── 博弈问题 │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── 双指针 │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── center.png │ └── title.png ├── 反转链表 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ └── title.png ├── 回文 │ └── title.png ├── 回文链表 │ ├── 1.gif │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ └── 4.jpg ├── 子序列 │ ├── 1.gif │ ├── 1.jpg │ ├── 2.gif │ ├── 2.jpg │ └── 3.jpg ├── 子集 │ ├── 1.jpg │ ├── 2.jpg │ └── 3.jpg ├── 字符串乘法 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.gif │ ├── 6.jpg │ └── title.png ├── 密码技术 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ └── 7.jpg ├── 座位调度 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ └── 7.jpg ├── 扔鸡蛋 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ └── dp.png ├── 接雨水 │ ├── 0.jpg │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ └── title.png ├── 数组交换 │ ├── ink-image (1).png │ ├── ink-image (2).png │ ├── ink-image (3).png │ └── ink-image.png ├── 最优子结构 │ └── 1.jpg ├── 最长回文子序列 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ └── 5.jpg ├── 最长递增子序列 │ ├── 1.jpeg │ ├── 2.jpeg │ ├── 3.jpeg │ ├── gif1.gif │ ├── gif2.gif │ ├── poker1.jpeg │ ├── poker2.jpeg │ ├── poker3.jpeg │ ├── poker4.jpeg │ └── title.png ├── 有序数组去重 │ ├── 1.gif │ ├── 2.gif │ └── title.png ├── 栈队列 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ └── 6.jpg ├── 概率问题 │ ├── p.png │ ├── p.svg │ ├── sanmen.png │ ├── sanmen.svg │ └── tree.png ├── 正则 │ ├── 1.jpeg │ ├── 2.jpeg │ ├── 3.jpeg │ ├── 4.jpeg │ ├── example.png │ └── title.png ├── 洗牌算法 │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.jpg │ └── 6.png ├── 滑动窗口 │ ├── 0.png │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── title1.png │ ├── title2.png │ └── title3.png ├── 缺失元素 │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── title.png │ └── xor.png ├── 股票问题 │ ├── 1.png │ └── title.png └── 设计Twitter │ ├── design.png │ ├── merge.gif │ ├── tweet.jpg │ └── user.jpg ├── starHistory.jpg ├── starHistory.png ├── 出版推广1.jpeg ├── 动态规划系列 ├── README.md ├── 动态规划之KMP字符匹配算法.md ├── 动态规划之博弈问题.md ├── 动态规划之四键键盘.md ├── 动态规划之正则表达.md ├── 动态规划设计:最长递增子序列.md ├── 动态规划详解进阶.md ├── 团灭股票问题.md ├── 子序列问题模板.md ├── 抢房子.md ├── 最优子结构.md ├── 最长公共子序列.md ├── 编辑距离.md ├── 贪心算法之区间调度问题.md ├── 高楼扔鸡蛋进阶.md └── 高楼扔鸡蛋问题.md ├── 技术 ├── linuxshell.md ├── linux进程.md ├── redis入侵.md ├── session和cookie.md ├── 在线练习平台.md └── 密码技术.md ├── 数据结构系列 ├── README.md ├── 二叉堆详解实现优先级队列.md ├── 二叉搜索树操作集锦.md ├── 单调栈.md ├── 单调队列.md ├── 实现计算器.md ├── 设计Twitter.md ├── 递归反转链表的一部分.md └── 队列实现栈栈实现队列.md ├── 算法思维系列 ├── FloodFill算法详解及应用.md ├── README.md ├── UnionFind算法应用.md ├── UnionFind算法详解.md ├── twoSum问题的核心思想.md ├── 为什么推荐算法4.md ├── 二分查找详解.md ├── 信封嵌套问题.md ├── 几个反直觉的概率问题.md ├── 前缀和技巧.md ├── 区间交集问题.md ├── 区间调度问题之区间合并.md ├── 双指针技巧.md ├── 回溯算法详解修订版.md ├── 字符串乘法.md ├── 学习数据结构和算法的高效方法.md ├── 常用的位操作.md ├── 洗牌算法.md ├── 滑动窗口技巧.md ├── 烧饼排序.md ├── 算法学习之路.md └── 递归详解.md └── 高频面试系列 ├── LRU算法.md ├── README.md ├── koko偷香蕉.md ├── k个一组反转链表.md ├── 一行代码解决的智力题.md ├── 二分查找判定子序列.md ├── 判断回文链表.md ├── 合法括号判定.md ├── 如何去除有序数组的重复元素.md ├── 子集排列组合.md ├── 座位调度.md ├── 打印素数.md ├── 接雨水.md ├── 最长回文子串.md ├── 水塘抽样.md ├── 消失的元素.md └── 缺失和重复的元素.md /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 发现问题 3 | about: 我发现了某处链接或者知识点的错误 4 | title: 'bug ' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | 14 | 15 | 你好,我发现如下文章有 bug(点击文字可跳转到相关文章): 16 | 17 | [动态规划系列/抢房子.md](https://github.com/labuladong/fucking-algorithm/blob/master/动态规划系列/抢房子.md) 18 | 19 | 问题描述: 20 | 21 | 某章图片链接失效/其中的 XXX 内容有误/等等。 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/others.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 其他issue 3 | about: 我还有一些其他的建议/问题 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/translate.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 参与翻译 3 | about: 我想参与仓库中文章的翻译工作 4 | title: 'translate ' 5 | labels: translate 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 我已阅读过[翻译组工作流程](https://github.com/labuladong/fucking-algorithm/issues/9),我已阅读过[翻译要求](https://github.com/labuladong/fucking-algorithm/blob/english/README.md),我已查看 [已完成列表](https://github.com/labuladong/fucking-algorithm/pulls?q=is%3Apr+is%3Aclosed),确保我要翻译的文章还没有被翻译。 19 | 20 | 我将开始翻译如下文章(点击可查看目标文章): 21 | 22 | 23 | [动态规划系列/抢房子.md](https://github.com/labuladong/fucking-algorithm/blob/master/动态规划系列/抢房子.md) 24 | 25 | 我对如何翻译此文章已经心中有数,我准备将它翻译成:**英文** 26 | 27 | 28 | **预计 3 天内翻译完成**,我会尽可能快地完成翻译,主仓库会对第一个完成的 pull request 添加翻译者昵称/姓名及个人链接。 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_store 2 | -------------------------------------------------------------------------------- /contributor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/contributor.jpg -------------------------------------------------------------------------------- /pictures/4keyboard/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/4keyboard/1.jpg -------------------------------------------------------------------------------- /pictures/4keyboard/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/4keyboard/title.png -------------------------------------------------------------------------------- /pictures/BST/BST_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/BST/BST_example.png -------------------------------------------------------------------------------- /pictures/BST/bst_deletion_case_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/BST/bst_deletion_case_1.png -------------------------------------------------------------------------------- /pictures/BST/bst_deletion_case_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/BST/bst_deletion_case_2.png -------------------------------------------------------------------------------- /pictures/BST/bst_deletion_case_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/BST/bst_deletion_case_3.png -------------------------------------------------------------------------------- /pictures/BST/假BST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/BST/假BST.png -------------------------------------------------------------------------------- /pictures/Chrome插件/baidumonkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/baidumonkey.png -------------------------------------------------------------------------------- /pictures/Chrome插件/baidu广告.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/baidu广告.png -------------------------------------------------------------------------------- /pictures/Chrome插件/csdnBlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/csdnBlock.png -------------------------------------------------------------------------------- /pictures/Chrome插件/githubzip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/githubzip.png -------------------------------------------------------------------------------- /pictures/Chrome插件/listen1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/listen1.png -------------------------------------------------------------------------------- /pictures/Chrome插件/monkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/monkey.png -------------------------------------------------------------------------------- /pictures/Chrome插件/oneTab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/oneTab.png -------------------------------------------------------------------------------- /pictures/Chrome插件/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/pin.png -------------------------------------------------------------------------------- /pictures/Chrome插件/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/tree.png -------------------------------------------------------------------------------- /pictures/Chrome插件/youhou优化.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/Chrome插件/youhou优化.png -------------------------------------------------------------------------------- /pictures/LCS/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LCS/1.png -------------------------------------------------------------------------------- /pictures/LCS/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LCS/2.png -------------------------------------------------------------------------------- /pictures/LCS/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LCS/3.png -------------------------------------------------------------------------------- /pictures/LCS/dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LCS/dp.png -------------------------------------------------------------------------------- /pictures/LCS/lcs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LCS/lcs.png -------------------------------------------------------------------------------- /pictures/LRU算法/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LRU算法/1.jpg -------------------------------------------------------------------------------- /pictures/LRU算法/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LRU算法/2.jpg -------------------------------------------------------------------------------- /pictures/LRU算法/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LRU算法/3.jpg -------------------------------------------------------------------------------- /pictures/LRU算法/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LRU算法/4.jpg -------------------------------------------------------------------------------- /pictures/LRU算法/put.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/LRU算法/put.jpg -------------------------------------------------------------------------------- /pictures/algo4/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/algo4/1.jpg -------------------------------------------------------------------------------- /pictures/algo4/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/algo4/2.jpg -------------------------------------------------------------------------------- /pictures/algo4/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/algo4/3.jpg -------------------------------------------------------------------------------- /pictures/algo4/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/algo4/title.png -------------------------------------------------------------------------------- /pictures/backtrack/ink-image (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/ink-image (1).png -------------------------------------------------------------------------------- /pictures/backtrack/ink-image (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/ink-image (2).png -------------------------------------------------------------------------------- /pictures/backtrack/ink-image (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/ink-image (3).png -------------------------------------------------------------------------------- /pictures/backtrack/ink-image (4).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/ink-image (4).png -------------------------------------------------------------------------------- /pictures/backtrack/ink-image (5).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/ink-image (5).png -------------------------------------------------------------------------------- /pictures/backtrack/ink-image (6).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/ink-image (6).png -------------------------------------------------------------------------------- /pictures/backtrack/ink-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/ink-image.png -------------------------------------------------------------------------------- /pictures/backtrack/nqueens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/nqueens.png -------------------------------------------------------------------------------- /pictures/backtrack/permutation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/permutation.png -------------------------------------------------------------------------------- /pictures/backtrack/代码.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/代码.png -------------------------------------------------------------------------------- /pictures/backtrack/代码1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/代码1.png -------------------------------------------------------------------------------- /pictures/backtrack/代码2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/代码2.png -------------------------------------------------------------------------------- /pictures/backtrack/代码3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/代码3.png -------------------------------------------------------------------------------- /pictures/backtrack/全排列.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtrack/全排列.png -------------------------------------------------------------------------------- /pictures/backtracking/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtracking/1.jpg -------------------------------------------------------------------------------- /pictures/backtracking/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtracking/2.jpg -------------------------------------------------------------------------------- /pictures/backtracking/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtracking/3.jpg -------------------------------------------------------------------------------- /pictures/backtracking/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtracking/4.jpg -------------------------------------------------------------------------------- /pictures/backtracking/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtracking/5.jpg -------------------------------------------------------------------------------- /pictures/backtracking/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtracking/6.jpg -------------------------------------------------------------------------------- /pictures/backtracking/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/backtracking/7.jpg -------------------------------------------------------------------------------- /pictures/calculator/1.1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/calculator/1.1.jpg -------------------------------------------------------------------------------- /pictures/calculator/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/calculator/1.jpg -------------------------------------------------------------------------------- /pictures/calculator/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/calculator/2.jpg -------------------------------------------------------------------------------- /pictures/calculator/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/calculator/3.jpg -------------------------------------------------------------------------------- /pictures/calculator/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/calculator/4.jpg -------------------------------------------------------------------------------- /pictures/calculator/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/calculator/5.jpg -------------------------------------------------------------------------------- /pictures/calculator/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/calculator/6.jpg -------------------------------------------------------------------------------- /pictures/dupmissing/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/dupmissing/1.gif -------------------------------------------------------------------------------- /pictures/dupmissing/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/dupmissing/2.jpg -------------------------------------------------------------------------------- /pictures/dupmissing/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/dupmissing/3.jpg -------------------------------------------------------------------------------- /pictures/editDistance/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/1.jpg -------------------------------------------------------------------------------- /pictures/editDistance/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/2.jpg -------------------------------------------------------------------------------- /pictures/editDistance/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/3.jpg -------------------------------------------------------------------------------- /pictures/editDistance/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/4.jpg -------------------------------------------------------------------------------- /pictures/editDistance/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/5.jpg -------------------------------------------------------------------------------- /pictures/editDistance/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/6.jpg -------------------------------------------------------------------------------- /pictures/editDistance/delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/delete.gif -------------------------------------------------------------------------------- /pictures/editDistance/dp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/dp.jpg -------------------------------------------------------------------------------- /pictures/editDistance/edit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/edit.gif -------------------------------------------------------------------------------- /pictures/editDistance/insert.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/insert.gif -------------------------------------------------------------------------------- /pictures/editDistance/replace.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/replace.gif -------------------------------------------------------------------------------- /pictures/editDistance/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/editDistance/title.png -------------------------------------------------------------------------------- /pictures/floodfill/floodfill.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/floodfill.gif -------------------------------------------------------------------------------- /pictures/floodfill/floodfill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/floodfill.png -------------------------------------------------------------------------------- /pictures/floodfill/leetcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/leetcode.png -------------------------------------------------------------------------------- /pictures/floodfill/ppt1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/ppt1.PNG -------------------------------------------------------------------------------- /pictures/floodfill/ppt2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/ppt2.PNG -------------------------------------------------------------------------------- /pictures/floodfill/ppt3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/ppt3.PNG -------------------------------------------------------------------------------- /pictures/floodfill/ppt4.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/ppt4.PNG -------------------------------------------------------------------------------- /pictures/floodfill/ppt5.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/ppt5.PNG -------------------------------------------------------------------------------- /pictures/floodfill/xiaoxiaole.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/xiaoxiaole.jpg -------------------------------------------------------------------------------- /pictures/floodfill/扫雷.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/扫雷.png -------------------------------------------------------------------------------- /pictures/floodfill/抠图.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/抠图.jpeg -------------------------------------------------------------------------------- /pictures/floodfill/抠图.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/floodfill/抠图.jpg -------------------------------------------------------------------------------- /pictures/group.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/group.jpg -------------------------------------------------------------------------------- /pictures/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/header.jpg -------------------------------------------------------------------------------- /pictures/heap/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/heap/1.png -------------------------------------------------------------------------------- /pictures/heap/delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/heap/delete.gif -------------------------------------------------------------------------------- /pictures/heap/insert.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/heap/insert.gif -------------------------------------------------------------------------------- /pictures/heap/sink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/heap/sink.gif -------------------------------------------------------------------------------- /pictures/heap/swim.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/heap/swim.gif -------------------------------------------------------------------------------- /pictures/intersection/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/intersection/1.jpg -------------------------------------------------------------------------------- /pictures/intersection/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/intersection/2.jpg -------------------------------------------------------------------------------- /pictures/intersection/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/intersection/3.jpg -------------------------------------------------------------------------------- /pictures/intersection/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/intersection/4.gif -------------------------------------------------------------------------------- /pictures/intersection/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/intersection/title.png -------------------------------------------------------------------------------- /pictures/interval/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/interval/1.gif -------------------------------------------------------------------------------- /pictures/interval/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/interval/2.jpg -------------------------------------------------------------------------------- /pictures/interval/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/interval/3.jpg -------------------------------------------------------------------------------- /pictures/interval/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/interval/4.jpg -------------------------------------------------------------------------------- /pictures/interval/title1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/interval/title1.png -------------------------------------------------------------------------------- /pictures/interval/title2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/interval/title2.png -------------------------------------------------------------------------------- /pictures/kgroup/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kgroup/1.jpg -------------------------------------------------------------------------------- /pictures/kgroup/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kgroup/2.jpg -------------------------------------------------------------------------------- /pictures/kgroup/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kgroup/3.jpg -------------------------------------------------------------------------------- /pictures/kgroup/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kgroup/4.jpg -------------------------------------------------------------------------------- /pictures/kgroup/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kgroup/5.jpg -------------------------------------------------------------------------------- /pictures/kgroup/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kgroup/6.jpg -------------------------------------------------------------------------------- /pictures/kgroup/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kgroup/7.jpg -------------------------------------------------------------------------------- /pictures/kgroup/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kgroup/8.gif -------------------------------------------------------------------------------- /pictures/kgroup/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kgroup/title.png -------------------------------------------------------------------------------- /pictures/kmp/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/1.gif -------------------------------------------------------------------------------- /pictures/kmp/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/2.gif -------------------------------------------------------------------------------- /pictures/kmp/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/3.gif -------------------------------------------------------------------------------- /pictures/kmp/A.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/A.gif -------------------------------------------------------------------------------- /pictures/kmp/allstate.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/allstate.jpg -------------------------------------------------------------------------------- /pictures/kmp/back.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/back.jpg -------------------------------------------------------------------------------- /pictures/kmp/dfa.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/dfa.gif -------------------------------------------------------------------------------- /pictures/kmp/exp1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/exp1.jpg -------------------------------------------------------------------------------- /pictures/kmp/exp2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/exp2.jpg -------------------------------------------------------------------------------- /pictures/kmp/exp3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/exp3.jpg -------------------------------------------------------------------------------- /pictures/kmp/exp4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/exp4.jpg -------------------------------------------------------------------------------- /pictures/kmp/exp5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/exp5.jpg -------------------------------------------------------------------------------- /pictures/kmp/exp6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/exp6.jpg -------------------------------------------------------------------------------- /pictures/kmp/exp7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/exp7.jpg -------------------------------------------------------------------------------- /pictures/kmp/forward.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/forward.jpg -------------------------------------------------------------------------------- /pictures/kmp/kmp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/kmp.gif -------------------------------------------------------------------------------- /pictures/kmp/shadow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/shadow.jpg -------------------------------------------------------------------------------- /pictures/kmp/shadow1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/shadow1.jpg -------------------------------------------------------------------------------- /pictures/kmp/shadow2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/shadow2.jpg -------------------------------------------------------------------------------- /pictures/kmp/state.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/state.jpg -------------------------------------------------------------------------------- /pictures/kmp/state2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/state2.jpg -------------------------------------------------------------------------------- /pictures/kmp/state4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/state4.jpg -------------------------------------------------------------------------------- /pictures/kmp/txt1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/txt1.jpg -------------------------------------------------------------------------------- /pictures/kmp/txt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/txt2.jpg -------------------------------------------------------------------------------- /pictures/kmp/txt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/txt3.jpg -------------------------------------------------------------------------------- /pictures/kmp/txt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/txt4.jpg -------------------------------------------------------------------------------- /pictures/kmp/z.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/kmp/z.jpg -------------------------------------------------------------------------------- /pictures/labuladong.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/labuladong.jpg -------------------------------------------------------------------------------- /pictures/labuladong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/labuladong.png -------------------------------------------------------------------------------- /pictures/linux-fs/application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/application.png -------------------------------------------------------------------------------- /pictures/linux-fs/apt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/apt.png -------------------------------------------------------------------------------- /pictures/linux-fs/bin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/bin.png -------------------------------------------------------------------------------- /pictures/linux-fs/boot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/boot.png -------------------------------------------------------------------------------- /pictures/linux-fs/cpu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/cpu.png -------------------------------------------------------------------------------- /pictures/linux-fs/desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/desktop.png -------------------------------------------------------------------------------- /pictures/linux-fs/dev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/dev.png -------------------------------------------------------------------------------- /pictures/linux-fs/etc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/etc.png -------------------------------------------------------------------------------- /pictures/linux-fs/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/home.png -------------------------------------------------------------------------------- /pictures/linux-fs/linux-filesystem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/linux-filesystem.png -------------------------------------------------------------------------------- /pictures/linux-fs/log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/log.png -------------------------------------------------------------------------------- /pictures/linux-fs/opt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/opt.png -------------------------------------------------------------------------------- /pictures/linux-fs/proc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/proc.png -------------------------------------------------------------------------------- /pictures/linux-fs/root.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/root.png -------------------------------------------------------------------------------- /pictures/linux-fs/sbin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/sbin.png -------------------------------------------------------------------------------- /pictures/linux-fs/tmp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/tmp.png -------------------------------------------------------------------------------- /pictures/linux-fs/usr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/usr.png -------------------------------------------------------------------------------- /pictures/linux-fs/usrbin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linux-fs/usrbin.png -------------------------------------------------------------------------------- /pictures/linuxProcess/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linuxProcess/1.jpg -------------------------------------------------------------------------------- /pictures/linuxProcess/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linuxProcess/2.jpg -------------------------------------------------------------------------------- /pictures/linuxProcess/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linuxProcess/3.jpg -------------------------------------------------------------------------------- /pictures/linuxProcess/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linuxProcess/4.jpg -------------------------------------------------------------------------------- /pictures/linuxProcess/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linuxProcess/5.jpg -------------------------------------------------------------------------------- /pictures/linuxProcess/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linuxProcess/6.jpg -------------------------------------------------------------------------------- /pictures/linuxProcess/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linuxProcess/7.jpg -------------------------------------------------------------------------------- /pictures/linuxProcess/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linuxProcess/8.jpg -------------------------------------------------------------------------------- /pictures/linuxshell/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/linuxshell/1.png -------------------------------------------------------------------------------- /pictures/mergeInterval/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/mergeInterval/1.jpg -------------------------------------------------------------------------------- /pictures/mergeInterval/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/mergeInterval/2.jpg -------------------------------------------------------------------------------- /pictures/mergeInterval/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/mergeInterval/3.gif -------------------------------------------------------------------------------- /pictures/mergeInterval/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/mergeInterval/title.png -------------------------------------------------------------------------------- /pictures/online/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/1.png -------------------------------------------------------------------------------- /pictures/online/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/10.png -------------------------------------------------------------------------------- /pictures/online/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/11.png -------------------------------------------------------------------------------- /pictures/online/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/2.png -------------------------------------------------------------------------------- /pictures/online/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/3.png -------------------------------------------------------------------------------- /pictures/online/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/4.png -------------------------------------------------------------------------------- /pictures/online/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/5.png -------------------------------------------------------------------------------- /pictures/online/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/6.png -------------------------------------------------------------------------------- /pictures/online/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/7.png -------------------------------------------------------------------------------- /pictures/online/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/8.png -------------------------------------------------------------------------------- /pictures/online/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/online/9.png -------------------------------------------------------------------------------- /pictures/others/leetcode.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/others/leetcode.jpeg -------------------------------------------------------------------------------- /pictures/pancakeSort/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/pancakeSort/1.jpg -------------------------------------------------------------------------------- /pictures/pancakeSort/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/pancakeSort/2.png -------------------------------------------------------------------------------- /pictures/pancakeSort/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/pancakeSort/3.jpg -------------------------------------------------------------------------------- /pictures/pancakeSort/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/pancakeSort/4.jpg -------------------------------------------------------------------------------- /pictures/pancakeSort/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/pancakeSort/title.png -------------------------------------------------------------------------------- /pictures/pay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/pay.jpg -------------------------------------------------------------------------------- /pictures/prime/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/prime/1.gif -------------------------------------------------------------------------------- /pictures/qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/qrcode.jpg -------------------------------------------------------------------------------- /pictures/redis入侵/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/redis入侵/1.png -------------------------------------------------------------------------------- /pictures/redis入侵/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/redis入侵/2.png -------------------------------------------------------------------------------- /pictures/redis入侵/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/redis入侵/3.png -------------------------------------------------------------------------------- /pictures/redis入侵/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/redis入侵/4.png -------------------------------------------------------------------------------- /pictures/redis入侵/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/redis入侵/5.png -------------------------------------------------------------------------------- /pictures/redis入侵/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/redis入侵/6.png -------------------------------------------------------------------------------- /pictures/result.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/result.jpg -------------------------------------------------------------------------------- /pictures/robber/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/robber/1.jpg -------------------------------------------------------------------------------- /pictures/robber/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/robber/2.jpg -------------------------------------------------------------------------------- /pictures/robber/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/robber/3.jpg -------------------------------------------------------------------------------- /pictures/robber/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/robber/title.png -------------------------------------------------------------------------------- /pictures/robber/title1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/robber/title1.png -------------------------------------------------------------------------------- /pictures/session/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/session/1.png -------------------------------------------------------------------------------- /pictures/session/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/session/2.png -------------------------------------------------------------------------------- /pictures/session/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/session/3.png -------------------------------------------------------------------------------- /pictures/session/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/session/4.jpg -------------------------------------------------------------------------------- /pictures/souyisou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/souyisou.png -------------------------------------------------------------------------------- /pictures/table_qr2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/table_qr2.jpg -------------------------------------------------------------------------------- /pictures/unionfind/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind/1.jpg -------------------------------------------------------------------------------- /pictures/unionfind/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind/2.jpg -------------------------------------------------------------------------------- /pictures/unionfind/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind/3.jpg -------------------------------------------------------------------------------- /pictures/unionfind/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind/4.jpg -------------------------------------------------------------------------------- /pictures/unionfind/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind/5.jpg -------------------------------------------------------------------------------- /pictures/unionfind/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind/6.jpg -------------------------------------------------------------------------------- /pictures/unionfind/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind/7.jpg -------------------------------------------------------------------------------- /pictures/unionfind/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind/8.jpg -------------------------------------------------------------------------------- /pictures/unionfind/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind/9.gif -------------------------------------------------------------------------------- /pictures/unionfind应用/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind应用/1.jpg -------------------------------------------------------------------------------- /pictures/unionfind应用/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind应用/2.jpg -------------------------------------------------------------------------------- /pictures/unionfind应用/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/unionfind应用/3.jpg -------------------------------------------------------------------------------- /pictures/youtube/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/youtube/1.png -------------------------------------------------------------------------------- /pictures/youtube/1573133096614.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/youtube/1573133096614.jpeg -------------------------------------------------------------------------------- /pictures/youtube/1573133131308.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/youtube/1573133131308.jpeg -------------------------------------------------------------------------------- /pictures/youtube/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/youtube/2.jpg -------------------------------------------------------------------------------- /pictures/youtube/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/youtube/3.jpg -------------------------------------------------------------------------------- /pictures/youtube/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/youtube/4.jpg -------------------------------------------------------------------------------- /pictures/二分应用/title1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/二分应用/title1.png -------------------------------------------------------------------------------- /pictures/二分应用/title2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/二分应用/title2.png -------------------------------------------------------------------------------- /pictures/二分查找/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/二分查找/1.jpg -------------------------------------------------------------------------------- /pictures/二分查找/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/二分查找/2.jpg -------------------------------------------------------------------------------- /pictures/二分查找/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/二分查找/3.jpg -------------------------------------------------------------------------------- /pictures/二分查找/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/二分查找/4.jpg -------------------------------------------------------------------------------- /pictures/二分查找/binarySearch1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/二分查找/binarySearch1.png -------------------------------------------------------------------------------- /pictures/二分查找/binarySearch2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/二分查找/binarySearch2.png -------------------------------------------------------------------------------- /pictures/二分查找/poem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/二分查找/poem.png -------------------------------------------------------------------------------- /pictures/位操作/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/位操作/1.png -------------------------------------------------------------------------------- /pictures/位操作/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/位操作/title.png -------------------------------------------------------------------------------- /pictures/信封嵌套/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/信封嵌套/0.jpg -------------------------------------------------------------------------------- /pictures/信封嵌套/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/信封嵌套/1.jpg -------------------------------------------------------------------------------- /pictures/信封嵌套/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/信封嵌套/2.jpg -------------------------------------------------------------------------------- /pictures/信封嵌套/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/信封嵌套/title.png -------------------------------------------------------------------------------- /pictures/前缀和/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/前缀和/1.jpg -------------------------------------------------------------------------------- /pictures/前缀和/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/前缀和/2.jpg -------------------------------------------------------------------------------- /pictures/前缀和/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/前缀和/title.png -------------------------------------------------------------------------------- /pictures/动态规划详解/coindp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/coindp.png -------------------------------------------------------------------------------- /pictures/动态规划详解/coinfunc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/coinfunc.png -------------------------------------------------------------------------------- /pictures/动态规划详解/cointree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/cointree.png -------------------------------------------------------------------------------- /pictures/动态规划详解/fibdp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/fibdp.png -------------------------------------------------------------------------------- /pictures/动态规划详解/fibfunc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/fibfunc.png -------------------------------------------------------------------------------- /pictures/动态规划详解/fibmemo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/fibmemo.png -------------------------------------------------------------------------------- /pictures/动态规划详解/fibtree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/fibtree.png -------------------------------------------------------------------------------- /pictures/动态规划详解/img_20190514_013033.441.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/img_20190514_013033.441.png -------------------------------------------------------------------------------- /pictures/动态规划详解/img_20190514_013830.397.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/img_20190514_013830.397.png -------------------------------------------------------------------------------- /pictures/动态规划详解/ink-image (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/ink-image (1).png -------------------------------------------------------------------------------- /pictures/动态规划详解/ink-image (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/ink-image (2).png -------------------------------------------------------------------------------- /pictures/动态规划详解/ink-image (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/ink-image (3).png -------------------------------------------------------------------------------- /pictures/动态规划详解/ink-image (4).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/ink-image (4).png -------------------------------------------------------------------------------- /pictures/动态规划详解/ink-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解/ink-image.png -------------------------------------------------------------------------------- /pictures/动态规划详解进阶/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解进阶/1.jpg -------------------------------------------------------------------------------- /pictures/动态规划详解进阶/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解进阶/2.jpg -------------------------------------------------------------------------------- /pictures/动态规划详解进阶/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解进阶/3.jpg -------------------------------------------------------------------------------- /pictures/动态规划详解进阶/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解进阶/4.jpg -------------------------------------------------------------------------------- /pictures/动态规划详解进阶/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解进阶/5.jpg -------------------------------------------------------------------------------- /pictures/动态规划详解进阶/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解进阶/6.jpg -------------------------------------------------------------------------------- /pictures/动态规划详解进阶/coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解进阶/coin.png -------------------------------------------------------------------------------- /pictures/动态规划详解进阶/fib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/动态规划详解进阶/fib.png -------------------------------------------------------------------------------- /pictures/单调栈/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/单调栈/1.png -------------------------------------------------------------------------------- /pictures/单调栈/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/单调栈/2.png -------------------------------------------------------------------------------- /pictures/单调栈/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/单调栈/3.png -------------------------------------------------------------------------------- /pictures/单调队列/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/单调队列/1.png -------------------------------------------------------------------------------- /pictures/单调队列/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/单调队列/2.png -------------------------------------------------------------------------------- /pictures/单调队列/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/单调队列/3.png -------------------------------------------------------------------------------- /pictures/单调队列/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/单调队列/title.png -------------------------------------------------------------------------------- /pictures/博弈问题/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/博弈问题/1.png -------------------------------------------------------------------------------- /pictures/博弈问题/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/博弈问题/2.png -------------------------------------------------------------------------------- /pictures/博弈问题/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/博弈问题/3.png -------------------------------------------------------------------------------- /pictures/博弈问题/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/博弈问题/4.png -------------------------------------------------------------------------------- /pictures/双指针/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/双指针/1.png -------------------------------------------------------------------------------- /pictures/双指针/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/双指针/2.png -------------------------------------------------------------------------------- /pictures/双指针/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/双指针/3.png -------------------------------------------------------------------------------- /pictures/双指针/center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/双指针/center.png -------------------------------------------------------------------------------- /pictures/双指针/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/双指针/title.png -------------------------------------------------------------------------------- /pictures/反转链表/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/反转链表/1.jpg -------------------------------------------------------------------------------- /pictures/反转链表/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/反转链表/2.jpg -------------------------------------------------------------------------------- /pictures/反转链表/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/反转链表/3.jpg -------------------------------------------------------------------------------- /pictures/反转链表/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/反转链表/4.jpg -------------------------------------------------------------------------------- /pictures/反转链表/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/反转链表/5.jpg -------------------------------------------------------------------------------- /pictures/反转链表/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/反转链表/6.jpg -------------------------------------------------------------------------------- /pictures/反转链表/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/反转链表/7.jpg -------------------------------------------------------------------------------- /pictures/反转链表/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/反转链表/title.png -------------------------------------------------------------------------------- /pictures/回文/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/回文/title.png -------------------------------------------------------------------------------- /pictures/回文链表/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/回文链表/1.gif -------------------------------------------------------------------------------- /pictures/回文链表/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/回文链表/1.jpg -------------------------------------------------------------------------------- /pictures/回文链表/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/回文链表/2.jpg -------------------------------------------------------------------------------- /pictures/回文链表/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/回文链表/3.jpg -------------------------------------------------------------------------------- /pictures/回文链表/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/回文链表/4.jpg -------------------------------------------------------------------------------- /pictures/子序列/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/子序列/1.gif -------------------------------------------------------------------------------- /pictures/子序列/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/子序列/1.jpg -------------------------------------------------------------------------------- /pictures/子序列/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/子序列/2.gif -------------------------------------------------------------------------------- /pictures/子序列/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/子序列/2.jpg -------------------------------------------------------------------------------- /pictures/子序列/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/子序列/3.jpg -------------------------------------------------------------------------------- /pictures/子集/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/子集/1.jpg -------------------------------------------------------------------------------- /pictures/子集/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/子集/2.jpg -------------------------------------------------------------------------------- /pictures/子集/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/子集/3.jpg -------------------------------------------------------------------------------- /pictures/字符串乘法/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/字符串乘法/1.jpg -------------------------------------------------------------------------------- /pictures/字符串乘法/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/字符串乘法/2.jpg -------------------------------------------------------------------------------- /pictures/字符串乘法/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/字符串乘法/3.jpg -------------------------------------------------------------------------------- /pictures/字符串乘法/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/字符串乘法/4.gif -------------------------------------------------------------------------------- /pictures/字符串乘法/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/字符串乘法/6.jpg -------------------------------------------------------------------------------- /pictures/字符串乘法/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/字符串乘法/title.png -------------------------------------------------------------------------------- /pictures/密码技术/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/密码技术/1.jpg -------------------------------------------------------------------------------- /pictures/密码技术/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/密码技术/2.jpg -------------------------------------------------------------------------------- /pictures/密码技术/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/密码技术/3.jpg -------------------------------------------------------------------------------- /pictures/密码技术/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/密码技术/4.jpg -------------------------------------------------------------------------------- /pictures/密码技术/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/密码技术/5.jpg -------------------------------------------------------------------------------- /pictures/密码技术/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/密码技术/6.jpg -------------------------------------------------------------------------------- /pictures/密码技术/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/密码技术/7.jpg -------------------------------------------------------------------------------- /pictures/座位调度/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/座位调度/1.jpg -------------------------------------------------------------------------------- /pictures/座位调度/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/座位调度/2.jpg -------------------------------------------------------------------------------- /pictures/座位调度/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/座位调度/3.jpg -------------------------------------------------------------------------------- /pictures/座位调度/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/座位调度/4.jpg -------------------------------------------------------------------------------- /pictures/座位调度/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/座位调度/5.jpg -------------------------------------------------------------------------------- /pictures/座位调度/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/座位调度/6.jpg -------------------------------------------------------------------------------- /pictures/座位调度/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/座位调度/7.jpg -------------------------------------------------------------------------------- /pictures/扔鸡蛋/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/扔鸡蛋/1.jpg -------------------------------------------------------------------------------- /pictures/扔鸡蛋/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/扔鸡蛋/2.jpg -------------------------------------------------------------------------------- /pictures/扔鸡蛋/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/扔鸡蛋/3.jpg -------------------------------------------------------------------------------- /pictures/扔鸡蛋/dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/扔鸡蛋/dp.png -------------------------------------------------------------------------------- /pictures/接雨水/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/接雨水/0.jpg -------------------------------------------------------------------------------- /pictures/接雨水/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/接雨水/1.jpg -------------------------------------------------------------------------------- /pictures/接雨水/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/接雨水/2.jpg -------------------------------------------------------------------------------- /pictures/接雨水/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/接雨水/3.jpg -------------------------------------------------------------------------------- /pictures/接雨水/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/接雨水/4.jpg -------------------------------------------------------------------------------- /pictures/接雨水/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/接雨水/5.jpg -------------------------------------------------------------------------------- /pictures/接雨水/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/接雨水/title.png -------------------------------------------------------------------------------- /pictures/数组交换/ink-image (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/数组交换/ink-image (1).png -------------------------------------------------------------------------------- /pictures/数组交换/ink-image (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/数组交换/ink-image (2).png -------------------------------------------------------------------------------- /pictures/数组交换/ink-image (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/数组交换/ink-image (3).png -------------------------------------------------------------------------------- /pictures/数组交换/ink-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/数组交换/ink-image.png -------------------------------------------------------------------------------- /pictures/最优子结构/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最优子结构/1.jpg -------------------------------------------------------------------------------- /pictures/最长回文子序列/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长回文子序列/1.jpg -------------------------------------------------------------------------------- /pictures/最长回文子序列/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长回文子序列/2.jpg -------------------------------------------------------------------------------- /pictures/最长回文子序列/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长回文子序列/3.jpg -------------------------------------------------------------------------------- /pictures/最长回文子序列/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长回文子序列/4.jpg -------------------------------------------------------------------------------- /pictures/最长回文子序列/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长回文子序列/5.jpg -------------------------------------------------------------------------------- /pictures/最长递增子序列/1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/1.jpeg -------------------------------------------------------------------------------- /pictures/最长递增子序列/2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/2.jpeg -------------------------------------------------------------------------------- /pictures/最长递增子序列/3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/3.jpeg -------------------------------------------------------------------------------- /pictures/最长递增子序列/gif1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/gif1.gif -------------------------------------------------------------------------------- /pictures/最长递增子序列/gif2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/gif2.gif -------------------------------------------------------------------------------- /pictures/最长递增子序列/poker1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/poker1.jpeg -------------------------------------------------------------------------------- /pictures/最长递增子序列/poker2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/poker2.jpeg -------------------------------------------------------------------------------- /pictures/最长递增子序列/poker3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/poker3.jpeg -------------------------------------------------------------------------------- /pictures/最长递增子序列/poker4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/poker4.jpeg -------------------------------------------------------------------------------- /pictures/最长递增子序列/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/最长递增子序列/title.png -------------------------------------------------------------------------------- /pictures/有序数组去重/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/有序数组去重/1.gif -------------------------------------------------------------------------------- /pictures/有序数组去重/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/有序数组去重/2.gif -------------------------------------------------------------------------------- /pictures/有序数组去重/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/有序数组去重/title.png -------------------------------------------------------------------------------- /pictures/栈队列/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/栈队列/1.jpg -------------------------------------------------------------------------------- /pictures/栈队列/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/栈队列/2.jpg -------------------------------------------------------------------------------- /pictures/栈队列/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/栈队列/3.jpg -------------------------------------------------------------------------------- /pictures/栈队列/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/栈队列/4.jpg -------------------------------------------------------------------------------- /pictures/栈队列/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/栈队列/5.jpg -------------------------------------------------------------------------------- /pictures/栈队列/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/栈队列/6.jpg -------------------------------------------------------------------------------- /pictures/概率问题/p.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/概率问题/p.png -------------------------------------------------------------------------------- /pictures/概率问题/sanmen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/概率问题/sanmen.png -------------------------------------------------------------------------------- /pictures/概率问题/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/概率问题/tree.png -------------------------------------------------------------------------------- /pictures/正则/1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/正则/1.jpeg -------------------------------------------------------------------------------- /pictures/正则/2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/正则/2.jpeg -------------------------------------------------------------------------------- /pictures/正则/3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/正则/3.jpeg -------------------------------------------------------------------------------- /pictures/正则/4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/正则/4.jpeg -------------------------------------------------------------------------------- /pictures/正则/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/正则/example.png -------------------------------------------------------------------------------- /pictures/正则/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/正则/title.png -------------------------------------------------------------------------------- /pictures/洗牌算法/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/洗牌算法/1.png -------------------------------------------------------------------------------- /pictures/洗牌算法/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/洗牌算法/2.png -------------------------------------------------------------------------------- /pictures/洗牌算法/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/洗牌算法/3.png -------------------------------------------------------------------------------- /pictures/洗牌算法/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/洗牌算法/4.png -------------------------------------------------------------------------------- /pictures/洗牌算法/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/洗牌算法/5.jpg -------------------------------------------------------------------------------- /pictures/洗牌算法/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/洗牌算法/6.png -------------------------------------------------------------------------------- /pictures/滑动窗口/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/滑动窗口/0.png -------------------------------------------------------------------------------- /pictures/滑动窗口/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/滑动窗口/1.png -------------------------------------------------------------------------------- /pictures/滑动窗口/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/滑动窗口/2.png -------------------------------------------------------------------------------- /pictures/滑动窗口/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/滑动窗口/3.png -------------------------------------------------------------------------------- /pictures/滑动窗口/title1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/滑动窗口/title1.png -------------------------------------------------------------------------------- /pictures/滑动窗口/title2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/滑动窗口/title2.png -------------------------------------------------------------------------------- /pictures/滑动窗口/title3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/滑动窗口/title3.png -------------------------------------------------------------------------------- /pictures/缺失元素/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/缺失元素/1.jpg -------------------------------------------------------------------------------- /pictures/缺失元素/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/缺失元素/2.jpg -------------------------------------------------------------------------------- /pictures/缺失元素/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/缺失元素/3.jpg -------------------------------------------------------------------------------- /pictures/缺失元素/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/缺失元素/title.png -------------------------------------------------------------------------------- /pictures/缺失元素/xor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/缺失元素/xor.png -------------------------------------------------------------------------------- /pictures/股票问题/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/股票问题/1.png -------------------------------------------------------------------------------- /pictures/股票问题/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/股票问题/title.png -------------------------------------------------------------------------------- /pictures/设计Twitter/design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/设计Twitter/design.png -------------------------------------------------------------------------------- /pictures/设计Twitter/merge.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/设计Twitter/merge.gif -------------------------------------------------------------------------------- /pictures/设计Twitter/tweet.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/设计Twitter/tweet.jpg -------------------------------------------------------------------------------- /pictures/设计Twitter/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/pictures/设计Twitter/user.jpg -------------------------------------------------------------------------------- /starHistory.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/starHistory.jpg -------------------------------------------------------------------------------- /starHistory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/starHistory.png -------------------------------------------------------------------------------- /出版推广1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yezz123-Archive/fucking-algorithm/a6a439e85c2fced8df32a7005dad8ac0f3a9cc9d/出版推广1.jpeg -------------------------------------------------------------------------------- /动态规划系列/README.md: -------------------------------------------------------------------------------- 1 | # 动态规划系列 2 | 3 | 我们公众号最火的就是动态规划系列的文章,也许是动态规划问题有难度而且有意思,也许因为它是面试常考题型。不管你之前是否害怕动态规划系列的问题,相信这一章的内容足以帮助你消除对动态规划算法的恐惧。 4 | 5 | 具体来说,动态规划的一般流程就是三步:**暴力的递归解法 -> 带备忘录的递归解法 -> 迭代的动态规划解法**。 6 | 7 | 就思考流程来说,就分为一下几步:**找到状态和选择 -> 明确 dp 数组/函数的定义 -> 寻找状态之间的关系**。 8 | 9 | 这就是思维模式的框架,**本章都会按照以上的模式来解决问题,辅助读者养成这种模式思维**,有了方向遇到问题就不会抓瞎,足以解决一般的动态规划问题。 10 | 11 | 欢迎关注我的公众号 labuladong,查看全部文章: 12 | 13 | ![labuladong二维码](../pictures/qrcode.jpg) -------------------------------------------------------------------------------- /动态规划系列/子序列问题模板.md: -------------------------------------------------------------------------------- 1 | # 动态规划之子序列问题解题模板 2 | 3 | 4 | 5 |

6 | GitHub 7 | 8 | 9 | 10 |

11 | 12 | ![](../pictures/souyisou.png) 13 | 14 | 相关推荐: 15 | * [洗牌算法](https://labuladong.gitee.io/algo/) 16 | * [twoSum问题的核心思想](https://labuladong.gitee.io/algo/) 17 | 18 | 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 19 | 20 | [516.最长回文子序列](https://leetcode-cn.com/problems/longest-palindromic-subsequence) 21 | 22 | **-----------** 23 | 24 | 子序列问题是常见的算法问题,而且并不好解决。 25 | 26 | 首先,子序列问题本身就相对子串、子数组更困难一些,因为前者是不连续的序列,而后两者是连续的,就算穷举你都不一定会,更别说求解相关的算法问题了。 27 | 28 | 而且,子序列问题很可能涉及到两个字符串,比如前文「最长公共子序列」,如果没有一定的处理经验,真的不容易想出来。所以本文就来扒一扒子序列问题的套路,其实就有两种模板,相关问题只要往这两种思路上想,十拿九稳。 29 | 30 | 一般来说,这类问题都是让你求一个**最长子序列**,因为最短子序列就是一个字符嘛,没啥可问的。一旦涉及到子序列和最值,那几乎可以肯定,**考察的是动态规划技巧,时间复杂度一般都是 O(n^2)**。 31 | 32 | 原因很简单,你想想一个字符串,它的子序列有多少种可能?起码是指数级的吧,这种情况下,不用动态规划技巧,还想怎么着? 33 | 34 | 既然要用动态规划,那就要定义 dp 数组,找状态转移关系。我们说的两种思路模板,就是 dp 数组的定义思路。不同的问题可能需要不同的 dp 数组定义来解决。 35 | 36 | ### 一、两种思路 37 | 38 | **1、第一种思路模板是一个一维的 dp 数组**: 39 | 40 | ```java 41 | int n = array.length; 42 | int[] dp = new int[n]; 43 | 44 | for (int i = 1; i < n; i++) { 45 | for (int j = 0; j < i; j++) { 46 | dp[i] = 最值(dp[i], dp[j] + ...) 47 | } 48 | } 49 | ``` 50 | 51 | 举个我们写过的例子「最长递增子序列」,在这个思路中 dp 数组的定义是: 52 | 53 | **在子数组 `array[0..i]` 中,我们要求的子序列(最长递增子序列)的长度是 `dp[i]`**。 54 | 55 | 为啥最长递增子序列需要这种思路呢?前文说得很清楚了,因为这样符合归纳法,可以找到状态转移的关系,这里就不具体展开了。 56 | 57 | **2、第二种思路模板是一个二维的 dp 数组**: 58 | 59 | ```java 60 | int n = arr.length; 61 | int[][] dp = new dp[n][n]; 62 | 63 | for (int i = 0; i < n; i++) { 64 | for (int j = 0; j < n; j++) { 65 | if (arr[i] == arr[j]) 66 | dp[i][j] = dp[i][j] + ... 67 | else 68 | dp[i][j] = 最值(...) 69 | } 70 | } 71 | ``` 72 | 73 | 这种思路运用相对更多一些,尤其是涉及两个字符串/数组的子序列,比如前文讲的「最长公共子序列」。本思路中 dp 数组含义又分为「只涉及一个字符串」和「涉及两个字符串」两种情况。 74 | 75 | **2.1 涉及两个字符串/数组时**(比如最长公共子序列),dp 数组的含义如下: 76 | 77 | **在子数组 `arr1[0..i]` 和子数组 `arr2[0..j]` 中,我们要求的子序列(最长公共子序列)长度为 `dp[i][j]`**。 78 | 79 | **2.2 只涉及一个字符串/数组时**(比如本文要讲的最长回文子序列),dp 数组的含义如下: 80 | 81 | **在子数组 `array[i..j]` 中,我们要求的子序列(最长回文子序列)的长度为 `dp[i][j]`**。 82 | 83 | 第一种情况可以参考这两篇旧文:「编辑距离」「公共子序列」 84 | 85 | 下面就借最长回文子序列这个问题,详解一下第二种情况下如何使用动态规划。 86 | 87 | ### 二、最长回文子序列 88 | 89 | 之前解决了「最长回文子串」的问题,这次提升难度,求最长回文子序列的长度: 90 | 91 | ![](../pictures/最长回文子序列/title.jpg) 92 | 93 | 我们说这个问题对 dp 数组的定义是:**在子串 `s[i..j]` 中,最长回文子序列的长度为 `dp[i][j]`**。一定要记住这个定义才能理解算法。 94 | 95 | 为啥这个问题要这样定义二维的 dp 数组呢?我们前文多次提到,**找状态转移需要归纳思维,说白了就是如何从已知的结果推出未知的部分**,这样定义容易归纳,容易发现状态转移关系。 96 | 97 | 具体来说,如果我们想求 `dp[i][j]`,假设你知道了子问题 `dp[i+1][j-1]` 的结果(`s[i+1..j-1]` 中最长回文子序列的长度),你是否能想办法算出 `dp[i][j]` 的值(`s[i..j]` 中,最长回文子序列的长度)呢? 98 | 99 | ![](../pictures/最长回文子序列/1.jpg) 100 | 101 | 可以!这取决于 `s[i]` 和 `s[j]` 的字符: 102 | 103 | **如果它俩相等**,那么它俩加上 `s[i+1..j-1]` 中的最长回文子序列就是 `s[i..j]` 的最长回文子序列: 104 | 105 | ![](../pictures/最长回文子序列/2.jpg) 106 | 107 | **如果它俩不相等**,说明它俩**不可能同时**出现在 `s[i..j]` 的最长回文子序列中,那么把它俩**分别**加入 `s[i+1..j-1]` 中,看看哪个子串产生的回文子序列更长即可: 108 | 109 | ![](../pictures/最长回文子序列/3.jpg) 110 | 111 | 以上两种情况写成代码就是这样: 112 | 113 | ```java 114 | if (s[i] == s[j]) 115 | // 它俩一定在最长回文子序列中 116 | dp[i][j] = dp[i + 1][j - 1] + 2; 117 | else 118 | // s[i+1..j] 和 s[i..j-1] 谁的回文子序列更长? 119 | dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); 120 | ``` 121 | 122 | 至此,状态转移方程就写出来了,根据 dp 数组的定义,我们要求的就是 `dp[0][n - 1]`,也就是整个 `s` 的最长回文子序列的长度。 123 | 124 | ### 三、代码实现 125 | 126 | 首先明确一下 base case,如果只有一个字符,显然最长回文子序列长度是 1,也就是 `dp[i][j] = 1 (i == j)`。 127 | 128 | 因为 `i` 肯定小于等于 `j`,所以对于那些 `i > j` 的位置,根本不存在什么子序列,应该初始化为 0。 129 | 130 | 另外,看看刚才写的状态转移方程,想求 `dp[i][j]` 需要知道 `dp[i+1][j-1]`,`dp[i+1][j]`,`dp[i][j-1]` 这三个位置;再看看我们确定的 base case,填入 dp 数组之后是这样: 131 | 132 | ![](../pictures/最长回文子序列/4.jpg) 133 | 134 | **为了保证每次计算 `dp[i][j]`,左下右方向的位置已经被计算出来,只能斜着遍历或者反着遍历**: 135 | 136 | ![](../pictures/最长回文子序列/5.jpg) 137 | 138 | 我选择反着遍历,代码如下: 139 | 140 | ```cpp 141 | int longestPalindromeSubseq(string s) { 142 | int n = s.size(); 143 | // dp 数组全部初始化为 0 144 | vector> dp(n, vector(n, 0)); 145 | // base case 146 | for (int i = 0; i < n; i++) 147 | dp[i][i] = 1; 148 | // 反着遍历保证正确的状态转移 149 | for (int i = n - 1; i >= 0; i--) { 150 | for (int j = i + 1; j < n; j++) { 151 | // 状态转移方程 152 | if (s[i] == s[j]) 153 | dp[i][j] = dp[i + 1][j - 1] + 2; 154 | else 155 | dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); 156 | } 157 | } 158 | // 整个 s 的最长回文子串长度 159 | return dp[0][n - 1]; 160 | } 161 | ``` 162 | 163 | 至此,最长回文子序列的问题就解决了。 164 | 165 | 166 | 167 | **_____________** 168 | 169 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 170 | 171 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,labuladong 带你搞定 LeetCode**。 172 | 173 |

174 | 175 |

176 | 177 | ======其他语言代码====== 178 | 179 | [516.最长回文子序列](https://leetcode-cn.com/problems/longest-palindromic-subsequence) 180 | 181 | ### javascript 182 | 183 | ```js 184 | /** 185 | * @param {string} s 186 | * @return {number} 187 | */ 188 | var longestPalindromeSubseq = function (s) { 189 | let l = s.length; 190 | if (l <= 1) { 191 | return l; 192 | } 193 | 194 | // 初始化一个 dp[l][l] 195 | let dp = new Array(l); 196 | for (let i = 0; i < l; i++) { 197 | dp[i] = new Array(l); 198 | dp[i].fill(0, 0, l) 199 | // // base case 200 | dp[i][i] = 1 201 | } 202 | 203 | // 从右下角开始,逐渐往上推 204 | for (let i = l - 2; i >= 0; i--) { 205 | for (let j = i + 1; j <= l - 1; j++) { 206 | if (s[i] === s[j]) { 207 | dp[i][j] = dp[i + 1][j - 1] + 2; 208 | } else { 209 | dp[i][j] = Math.max( 210 | dp[i + 1][j], 211 | dp[i][j - 1] 212 | ) 213 | } 214 | } 215 | } 216 | return dp[0][l - 1] 217 | }; 218 | ``` 219 | 220 | -------------------------------------------------------------------------------- /动态规划系列/最优子结构.md: -------------------------------------------------------------------------------- 1 | # 动态规划答疑篇 2 | 3 | 4 | 5 |

6 | GitHub 7 | 8 | 9 | 10 |

11 | 12 | ![](../pictures/souyisou.png) 13 | 14 | 相关推荐: 15 | * [搜索引擎背后的经典数据结构和算法](https://labuladong.gitee.io/algo/) 16 | * [动态规划之四键键盘](https://labuladong.gitee.io/algo/) 17 | 18 | **-----------** 19 | 20 | 这篇文章就给你讲明白两个问题: 21 | 22 | 1、到底什么才叫「最优子结构」,和动态规划什么关系。 23 | 24 | 2、为什么动态规划遍历 `dp` 数组的方式五花八门,有的正着遍历,有的倒着遍历,有的斜着遍历。 25 | 26 | ### 一、最优子结构详解 27 | 28 | 「最优子结构」是某些问题的一种特定性质,并不是动态规划问题专有的。也就是说,很多问题其实都具有最优子结构,只是其中大部分不具有重叠子问题,所以我们不把它们归为动态规划系列问题而已。 29 | 30 | 我先举个很容易理解的例子:假设你们学校有 10 个班,你已经计算出了每个班的最高考试成绩。那么现在我要求你计算全校最高的成绩,你会不会算?当然会,而且你不用重新遍历全校学生的分数进行比较,而是只要在这 10 个最高成绩中取最大的就是全校的最高成绩。 31 | 32 | 我给你提出的这个问题就**符合最优子结构**:可以从子问题的最优结果推出更大规模问题的最优结果。让你算**每个班**的最优成绩就是子问题,你知道所有子问题的答案后,就可以借此推出**全校**学生的最优成绩这个规模更大的问题的答案。 33 | 34 | 你看,这么简单的问题都有最优子结构性质,只是因为显然没有重叠子问题,所以我们简单地求最值肯定用不出动态规划。 35 | 36 | 再举个例子:假设你们学校有 10 个班,你已知每个班的最大分数差(最高分和最低分的差值)。那么现在我让你计算全校学生中的最大分数差,你会不会算?可以想办法算,但是肯定不能通过已知的这 10 个班的最大分数差推到出来。因为这 10 个班的最大分数差不一定就包含全校学生的最大分数差,比如全校的最大分数差可能是 3 班的最高分和 6 班的最低分之差。 37 | 38 | 这次我给你提出的问题就**不符合最优子结构**,因为你没办通过每个班的最优值推出全校的最优值,没办法通过子问题的最优值推出规模更大的问题的最优值。前文「动态规划详解」说过,想满足最优子结,子问题之间必须互相独立。全校的最大分数差可能出现在两个班之间,显然子问题不独立,所以这个问题本身不符合最优子结构。 39 | 40 | **那么遇到这种最优子结构失效情况,怎么办?策略是:改造问题**。对于最大分数差这个问题,我们不是没办法利用已知的每个班的分数差吗,那我只能这样写一段暴力代码: 41 | 42 | ```java 43 | int result = 0; 44 | for (Student a : school) { 45 | for (Student b : school) { 46 | if (a is b) continue; 47 | result = max(result, |a.score - b.score|); 48 | } 49 | } 50 | return result; 51 | ``` 52 | 53 | 改造问题,也就是把问题等价转化:最大分数差,不就等价于最高分数和最低分数的差么,那不就是要求最高和最低分数么,不就是我们讨论的第一个问题么,不就具有最优子结构了么?那现在改变思路,借助最优子结构解决最值问题,再回过头解决最大分数差问题,是不是就高效多了? 54 | 55 | 当然,上面这个例子太简单了,不过请读者回顾一下,我们做动态规划问题,是不是一直在求各种最值,本质跟我们举的例子没啥区别,无非需要处理一下重叠子问题。 56 | 57 | 前文不[同定义不同解法](https://labuladong.gitee.io/algo/) 和 [高楼扔鸡蛋进阶](https://labuladong.gitee.io/algo/) 就展示了如何改造问题,不同的最优子结构,可能导致不同的解法和效率。 58 | 59 | 再举个常见但也十分简单的例子,求一棵二叉树的最大值,不难吧(简单起见,假设节点中的值都是非负数): 60 | 61 | ```java 62 | int maxVal(TreeNode root) { 63 | if (root == null) 64 | return -1; 65 | int left = maxVal(root.left); 66 | int right = maxVal(root.right); 67 | return max(root.val, left, right); 68 | } 69 | ``` 70 | 71 | 你看这个问题也符合最优子结构,以 `root` 为根的树的最大值,可以通过两边子树(子问题)的最大值推导出来,结合刚才学校和班级的例子,很容易理解吧。 72 | 73 | 当然这也不是动态规划问题,旨在说明,最优子结构并不是动态规划独有的一种性质,能求最值的问题大部分都具有这个性质;**但反过来,最优子结构性质作为动态规划问题的必要条件,一定是让你求最值的**,以后碰到那种恶心人的最值题,思路往动态规划想就对了,这就是套路。 74 | 75 | 动态规划不就是从最简单的 base case 往后推导吗,可以想象成一个链式反应,以小博大。但只有符合最优子结构的问题,才有发生这种链式反应的性质。 76 | 77 | 找最优子结构的过程,其实就是证明状态转移方程正确性的过程,方程符合最优子结构就可以写暴力解了,写出暴力解就可以看出有没有重叠子问题了,有则优化,无则 OK。这也是套路,经常刷题的朋友应该能体会。 78 | 79 | 这里就不举那些正宗动态规划的例子了,读者可以翻翻历史文章,看看状态转移是如何遵循最优子结构的,这个话题就聊到这,下面再来看另外个动态规划迷惑行为。 80 | 81 | ### 二、dp 数组的遍历方向 82 | 83 | 我相信读者做动态规问题时,肯定会对 `dp` 数组的遍历顺序有些头疼。我们拿二维 `dp` 数组来举例,有时候我们是正向遍历: 84 | 85 | ```java 86 | int[][] dp = new int[m][n]; 87 | for (int i = 0; i < m; i++) 88 | for (int j = 0; j < n; j++) 89 | // 计算 dp[i][j] 90 | ``` 91 | 92 | 有时候我们反向遍历: 93 | 94 | ```java 95 | for (int i = m - 1; i >= 0; i--) 96 | for (int j = n - 1; j >= 0; j--) 97 | // 计算 dp[i][j] 98 | ``` 99 | 100 | 有时候可能会斜向遍历: 101 | 102 | ```java 103 | // 斜着遍历数组 104 | for (int l = 2; l <= n; l++) { 105 | for (int i = 0; i <= n - l; i++) { 106 | int j = l + i - 1; 107 | // 计算 dp[i][j] 108 | } 109 | } 110 | ``` 111 | 112 | 甚至更让人迷惑的是,有时候发现正向反向遍历都可以得到正确答案,比如我们在「团灭股票问题」中有的地方就正反皆可。 113 | 114 | 那么,如果仔细观察的话可以发现其中的原因的。你只要把住两点就行了: 115 | 116 | **1、遍历的过程中,所需的状态必须是已经计算出来的**。 117 | 118 | **2、遍历的终点必须是存储结果的那个位置**。 119 | 120 | 下面来距离解释上面两个原则是什么意思。 121 | 122 | 比如编辑距离这个经典的问题,详解见前文「编辑距离详解」,我们通过对 `dp` 数组的定义,确定了 base case 是 `dp[..][0]` 和 `dp[0][..]`,最终答案是 `dp[m][n]`;而且我们通过状态转移方程知道 `dp[i][j]` 需要从 `dp[i-1][j]`, `dp[i][j-1]`, `dp[i-1][j-1]` 转移而来,如下图: 123 | 124 | ![](../pictures/最优子结构/1.jpg) 125 | 126 | 那么,参考刚才说的两条原则,你该怎么遍历 `dp` 数组?肯定是正向遍历: 127 | 128 | ```java 129 | for (int i = 1; i < m; i++) 130 | for (int j = 1; j < n; j++) 131 | // 通过 dp[i-1][j], dp[i][j - 1], dp[i-1][j-1] 132 | // 计算 dp[i][j] 133 | ``` 134 | 135 | 因为,这样每一步迭代的左边、上边、左上边的位置都是 base case 或者之前计算过的,而且最终结束在我们想要的答案 `dp[m][n]`。 136 | 137 | 再举一例,回文子序列问题,详见前文「子序列问题模板」,我们通过过对 `dp` 数组的定义,确定了 base case 处在中间的对角线,`dp[i][j]` 需要从 `dp[i+1][j]`, `dp[i][j-1]`, `dp[i+1][j-1]` 转移而来,想要求的最终答案是 `dp[0][n-1]`,如下图: 138 | 139 | ![](../pictures/最长回文子序列/4.jpg) 140 | 141 | 这种情况根据刚才的两个原则,就可以有两种正确的遍历方式: 142 | 143 | ![](../pictures/最长回文子序列/5.jpg) 144 | 145 | 要么从左至右斜着遍历,要么从下向上从左到右遍历,这样才能保证每次 `dp[i][j]` 的左边、下边、左下边已经计算完毕,得到正确结果。 146 | 147 | 现在,你应该理解了这两个原则,主要就是看 base case 和最终结果的存储位置,保证遍历过程中使用的数据都是计算完毕的就行,有时候确实存在多种方法可以得到正确答案,可根据个人口味自行选择。 148 | 149 | 150 | **_____________** 151 | 152 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 153 | 154 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 155 | 156 |

157 | 158 |

159 | ======其他语言代码====== 160 | 161 | ### javascript 162 | 163 | 正向遍历 164 | 165 | ```js 166 | // 构建m*n的矩阵 167 | let dp = new Array(m).fill(new Array(n)) 168 | 169 | for (let i = 0; i < m; i++) 170 | for (let j = 0; j < n; j++) 171 | // 计算 dp[i][j] 172 | ``` 173 | 174 | 反向遍历 175 | 176 | ```js 177 | for (let i = m - 1; i >= 0; i--) 178 | for (let j = n - 1; j >= 0; j--) 179 | // 计算 dp[i][j] 180 | ``` 181 | 182 | 斜向遍历 183 | 184 | ```js 185 | // 斜着遍历数组 186 | for (let l = 2; l <= n; l++) { 187 | for (let i = 0; i <= n - l; i++) { 188 | let j = l + i - 1; 189 | // 计算 dp[i][j] 190 | } 191 | } 192 | ``` 193 | 194 | -------------------------------------------------------------------------------- /技术/linuxshell.md: -------------------------------------------------------------------------------- 1 | # 关于 Linux shell 你必须知道的技巧 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [状态压缩:对动态规划进行降维打击](https://labuladong.gitee.io/algo/) 15 | * [我用四个命令概括了 Git 的所有套路](https://labuladong.gitee.io/algo/) 16 | 17 | **-----------** 18 | 19 | 我个人很喜欢使用 Linux 系统,虽然说 Windows 的图形化界面做的确实比 Linux 好,但是对脚本的支持太差了。一开始有点不习惯命令行操作,但是熟悉了之后反而发现移动鼠标点点点才是浪费时间的罪魁祸首。。。 20 | 21 | **那么对于 Linux 命令行,本文不是介绍某些命令的用法,而是说明一些简单却特别容易让人迷惑的细节问题**。 22 | 23 | 1、标准输入和命令参数的区别。 24 | 25 | 2、在后台运行命令在退出终端后也全部退出了。 26 | 27 | 3、单引号和双引号表示字符串的区别。 28 | 29 | 4、有的命令和`sudo`一起用就 command not found。 30 | 31 | ### 一、标准输入和参数的区别 32 | 33 | 这个问题一定是最容易让人迷惑的,具体来说,就是搞不清什么时候用管道符`|`和文件重定向`>`,`<`,什么时候用变量`$`。 34 | 35 | 比如说,我现在有个自动连接宽带的 shell 脚本`connect.sh`,存在我的家目录: 36 | 37 | ```shell 38 | $ where connect.sh 39 | /home/fdl/bin/connect.sh 40 | ``` 41 | 42 | 如果我想删除这个脚本,而且想少敲几次键盘,应该怎么操作呢?我曾经这样尝试过: 43 | 44 | ```shell 45 | $ where connect.sh | rm 46 | ``` 47 | 48 | 实际上,这样操作是错误的,正确的做法应该是这样的: 49 | 50 | ```shell 51 | $ rm $(where connect.sh) 52 | ``` 53 | 54 | 前者试图将`where`的结果连接到`rm`的标准输入,后者试图将结果作为命令行参数传入。 55 | 56 | **标准输入就是编程语言中诸如`scanf`或者`readline`这种命令;而参数是指程序的`main`函数传入的`args`字符数组**。 57 | 58 | 前文「Linux文件描述符」说过,管道符和重定向符是将数据作为程序的标准输入,而`$(cmd)`是读取`cmd`命令输出的数据作为参数。 59 | 60 | 用刚才的例子说,`rm`命令源代码中肯定不接受标准输入,而是接收命令行参数,删除相应的文件。作为对比,`cat`命令是既接受标准输入,又接受命令行参数: 61 | 62 | ```shell 63 | $ cat filename 64 | ...file text... 65 | 66 | $ cat < filename 67 | ...file text... 68 | 69 | $ echo 'hello world' | cat 70 | hello world 71 | ``` 72 | 73 | **如果命令能够让终端阻塞,说明该命令接收标准输入,反之就是不接受**,比如你只运行`cat`命令不加任何参数,终端就会阻塞,等待你输入字符串并回显相同的字符串。 74 | 75 | ### 二、后台运行程序 76 | 77 | 比如说你远程登录到服务器上,运行一个 Django web 程序: 78 | 79 | ```shell 80 | $ python manager.py runserver 0.0.0.0 81 | Listening on 0.0.0.0:8080... 82 | ``` 83 | 84 | 现在你可以通过服务器的 IP 地址测试 Django 服务,但是终端此时就阻塞了,你输入什么都不响应,除非输入 Ctrl-C 或者 Ctrl-/ 终止 python 进程。 85 | 86 | 可以在命令之后加一个`&`符号,这样命令行不会阻塞,可以响应你后续输入的命令,但是如果你退出服务器的登录,就不能访问该网页了。 87 | 88 | 如果你想在退出服务器之后仍然能够访问 web 服务,应该这样写命令 `(cmd &)`: 89 | 90 | ```shell 91 | $ (python manager.py runserver 0.0.0.0 &) 92 | Listening on 0.0.0.0:8080... 93 | 94 | $ logout 95 | ``` 96 | 97 | **底层原理是这样的**: 98 | 99 | 每一个命令行终端都是一个 shell 进程,你在这个终端里执行的程序实际上都是这个 shell 进程分出来的子进程。正常情况下,shell 进程会阻塞,等待子进程退出才重新接收你输入的新的命令。加上`&`号,只是让 shell 进程不再阻塞,可以继续响应你的新命令。但是无论如何,你如果关掉了这个 shell 命令行端口,依附于它的所有子进程都会退出。 100 | 101 | 而`(cmd &)`这样运行命令,则是将`cmd`命令挂到一个`systemd`系统守护进程名下,认`systemd`做爸爸,这样当你退出当前终端时,对于刚才的`cmd`命令就完全没有影响了。 102 | 103 | 类似的,还有一种后台运行常用的做法是这样: 104 | 105 | ```shell 106 | $ nohup some_cmd & 107 | ``` 108 | 109 | `nohup`命令也是类似的原理,不过通过我的测试,还是`(cmd &)`这种形式更加稳定。 110 | 111 | ### 三、单引号和双引号的区别 112 | 113 | 不同的 shell 行为会有细微区别,但有一点是确定的,**对于`$`,`(`,`)`这几个符号,单引号包围的字符串不会做任何转义,双引号包围的字符串会转义**。 114 | 115 | shell 的行为可以测试,使用`set -x`命令,会开启 shell 的命令回显,你可以通过回显观察 shell 到底在执行什么命令: 116 | 117 | ![](../pictures/linuxshell/1.png) 118 | 119 | 可见 `echo $(cmd)` 和 `echo "$(cmd)"`,结果差不多,但是仍然有区别。注意观察,双引号转义完成的结果会自动增加单引号,而前者不会。 120 | 121 | **也就是说,如果 `$` 读取出的参数字符串包含空格,应该用双引号括起来,否则就会出错**。 122 | 123 | ### 四、sudo 找不到命令 124 | 125 | 有时候我们普通用户可以用的命令,用 `sudo` 加权限之后却报错 command not found: 126 | 127 | ```shell 128 | $ connect.sh 129 | network-manager: Permission denied 130 | 131 | $ sudo connect.sh 132 | sudo: command not found 133 | ``` 134 | 135 | 原因在于,`connect.sh` 这个脚本仅存在于该用户的环境变量中: 136 | 137 | ```shell 138 | $ where connect.sh 139 | /home/fdl/bin/connect.sh 140 | ``` 141 | 142 | **当使用 `sudo` 时,系统会使用 `/etc/sudoers` 这个文件中规定的该用户的权限和环境变量**,而这个脚本在 `/etc/sudoers` 环境变量目录中当然是找不到的。 143 | 144 | 解决方法是使用脚本文件的路径,而不是仅仅通过脚本名称: 145 | 146 | ```shell 147 | $ sudo /home/fdl/bin/connect.sh 148 | ``` 149 | 150 | **_____________** 151 | 152 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 153 | 154 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 155 | 156 |

157 | 158 |

159 | 160 | ======其他语言代码====== 161 | -------------------------------------------------------------------------------- /技术/linux进程.md: -------------------------------------------------------------------------------- 1 | # Linux的进程、线程、文件描述符是什么 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [一文解决三道区间问题](https://labuladong.gitee.io/algo/) 15 | * [Union-Find算法详解](https://labuladong.gitee.io/algo/) 16 | 17 | **-----------** 18 | 19 | 说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案:**在 Linux 系统中,进程和线程几乎没有区别**。 20 | 21 | Linux 中的进程就是一个数据结构,看明白就可以理解文件描述符、重定向、管道命令的底层工作原理,最后我们从操作系统的角度看看为什么说线程和进程基本没有区别。 22 | 23 | ### 一、进程是什么 24 | 25 | 首先,抽象地来说,我们的计算机就是这个东西: 26 | 27 | ![](../pictures/linuxProcess/1.jpg) 28 | 29 | 这个大的矩形表示计算机的**内存空间**,其中的小矩形代表**进程**,左下角的圆形表示**磁盘**,右下角的图形表示一些**输入输出设备**,比如鼠标键盘显示器等等。另外,注意到内存空间被划分为了两块,上半部分表示**用户空间**,下半部分表示**内核空间**。 30 | 31 | 用户空间装着用户进程需要使用的资源,比如你在程序代码里开一个数组,这个数组肯定存在用户空间;内核空间存放内核进程需要加载的系统资源,这一些资源一般是不允许用户访问的。但是注意有的用户进程会共享一些内核空间的资源,比如一些动态链接库等等。 32 | 33 | 我们用 C 语言写一个 hello 程序,编译后得到一个可执行文件,在命令行运行就可以打印出一句 hello world,然后程序退出。在操作系统层面,就是新建了一个进程,这个进程将我们编译出来的可执行文件读入内存空间,然后执行,最后退出。 34 | 35 | **你编译好的那个可执行程序只是一个文件**,不是进程,可执行文件必须要载入内存,包装成一个进程才能真正跑起来。进程是要依靠操作系统创建的,每个进程都有它的固有属性,比如进程号(PID)、进程状态、打开的文件等等,进程创建好之后,读入你的程序,你的程序才被系统执行。 36 | 37 | 那么,操作系统是如何创建进程的呢?**对于操作系统,进程就是一个数据结构**,我们直接来看 Linux 的源码: 38 | 39 | ```cpp 40 | struct task_struct { 41 | // 进程状态 42 | long state; 43 | // 虚拟内存结构体 44 | struct mm_struct *mm; 45 | // 进程号 46 | pid_t pid; 47 | // 指向父进程的指针 48 | struct task_struct __rcu *parent; 49 | // 子进程列表 50 | struct list_head children; 51 | // 存放文件系统信息的指针 52 | struct fs_struct *fs; 53 | // 一个数组,包含该进程打开的文件指针 54 | struct files_struct *files; 55 | }; 56 | ``` 57 | 58 | `task_struct`就是 Linux 内核对于一个进程的描述,也可以称为「进程描述符」。源码比较复杂,我这里就截取了一小部分比较常见的。 59 | 60 | 其中比较有意思的是`mm`指针和`files`指针。`mm`指向的是进程的虚拟内存,也就是载入资源和可执行文件的地方;`files`指针指向一个数组,这个数组里装着所有该进程打开的文件的指针。 61 | 62 | ### 二、文件描述符是什么 63 | 64 | 先说`files`,它是一个文件指针数组。一般来说,一个进程会从`files[0]`读取输入,将输出写入`files[1]`,将错误信息写入`files[2]`。 65 | 66 | 举个例子,以我们的角度 C 语言的`printf`函数是向命令行打印字符,但是从进程的角度来看,就是向`files[1]`写入数据;同理,`scanf`函数就是进程试图从`files[0]`这个文件中读取数据。 67 | 68 | **每个进程被创建时,`files`的前三位被填入默认值,分别指向标准输入流、标准输出流、标准错误流。我们常说的「文件描述符」就是指这个文件指针数组的索引**,所以程序的文件描述符默认情况下 0 是输入,1 是输出,2 是错误。 69 | 70 | 我们可以重新画一幅图: 71 | 72 | ![](../pictures/linuxProcess/2.jpg) 73 | 74 | 对于一般的计算机,输入流是键盘,输出流是显示器,错误流也是显示器,所以现在这个进程和内核连了三根线。因为硬件都是由内核管理的,我们的进程需要通过「系统调用」让内核进程访问硬件资源。 75 | 76 | PS:不要忘了,Linux 中一切都被抽象成文件,设备也是文件,可以进行读和写。 77 | 78 | 如果我们写的程序需要其他资源,比如打开一个文件进行读写,这也很简单,进行系统调用,让内核把文件打开,这个文件就会被放到`files`的第 4 个位置: 79 | 80 | ![](../pictures/linuxProcess/3.jpg) 81 | 82 | 明白了这个原理,**输入重定向**就很好理解了,程序想读取数据的时候就会去`files[0]`读取,所以我们只要把`files[0]`指向一个文件,那么程序就会从这个文件中读取数据,而不是从键盘: 83 | 84 | ```shell 85 | $ command < file.txt 86 | ``` 87 | 88 | ![](../pictures/linuxProcess/5.jpg) 89 | 90 | 同理,**输出重定向**就是把`files[1]`指向一个文件,那么程序的输出就不会写入到显示器,而是写入到这个文件中: 91 | 92 | ```shell 93 | $ command > file.txt 94 | ``` 95 | 96 | ![](../pictures/linuxProcess/4.jpg) 97 | 98 | 错误重定向也是一样的,就不再赘述。 99 | 100 | **管道符**其实也是异曲同工,把一个进程的输出流和另一个进程的输入流接起一条「管道」,数据就在其中传递,不得不说这种设计思想真的很优美: 101 | 102 | ```shell 103 | $ cmd1 | cmd2 | cmd3 104 | ``` 105 | 106 | ![](../pictures/linuxProcess/6.jpg) 107 | 108 | 到这里,你可能也看出「Linux 中一切皆文件」设计思路的高明了,不管是设备、另一个进程、socket 套接字还是真正的文件,全部都可以读写,统一装进一个简单的`files`数组,进程通过简单的文件描述符访问相应资源,具体细节交于操作系统,有效解耦,优美高效。 109 | 110 | ### 三、线程是什么 111 | 112 | 首先要明确的是,多进程和多线程都是并发,都可以提高处理器的利用效率,所以现在的关键是,多线程和多进程有啥区别。 113 | 114 | 为什么说 Linux 中线程和进程基本没有区别呢,因为从 Linux 内核的角度来看,并没有把线程和进程区别对待。 115 | 116 | 我们知道系统调用`fork()`可以新建一个子进程,函数`pthread()`可以新建一个线程。**但无论线程还是进程,都是用`task_struct`结构表示的,唯一的区别就是共享的数据区域不同**。 117 | 118 | 换句话说,线程看起来跟进程没有区别,只是线程的某些数据区域和其父进程是共享的,而子进程是拷贝副本,而不是共享。就比如说,`mm`结构和`files`结构在线程中都是共享的,我画两张图你就明白了: 119 | 120 | ![](../pictures/linuxProcess/7.jpg) 121 | 122 | ![](../pictures/linuxProcess/8.jpg) 123 | 124 | 所以说,我们的多线程程序要利用锁机制,避免多个线程同时往同一区域写入数据,否则可能造成数据错乱。 125 | 126 | 那么你可能问,**既然进程和线程差不多,而且多进程数据不共享,即不存在数据错乱的问题,为什么多线程的使用比多进程普遍得多呢**? 127 | 128 | 因为现实中数据共享的并发更普遍呀,比如十个人同时从一个账户取十元,我们希望的是这个共享账户的余额正确减少一百元,而不是希望每人获得一个账户的拷贝,每个拷贝账户减少十元。 129 | 130 | 当然,必须要说明的是,只有 Linux 系统将线程看做共享数据的进程,不对其做特殊看待,其他的很多操作系统是对线程和进程区别对待的,线程有其特有的数据结构,我个人认为不如 Linux 的这种设计简洁,增加了系统的复杂度。 131 | 132 | 在 Linux 中新建线程和进程的效率都是很高的,对于新建进程时内存区域拷贝的问题,Linux 采用了 copy-on-write 的策略优化,也就是并不真正复制父进程的内存空间,而是等到需要写操作时才去复制。**所以 Linux 中新建进程和新建线程都是很迅速的**。 133 | 134 | **_____________** 135 | 136 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 137 | 138 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 139 | 140 |

141 | 142 |

143 | 144 | ======其他语言代码====== -------------------------------------------------------------------------------- /技术/redis入侵.md: -------------------------------------------------------------------------------- 1 | # Redis 入侵 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [烧饼排序](https://labuladong.gitee.io/algo/) 15 | * [动态规划之正则表达](https://labuladong.gitee.io/algo/) 16 | 17 | **-----------** 18 | 19 | 好吧,我也做了回标题党,像我这么细心的同学,怎么可能让服务器被入侵呢? 20 | 21 | 其实是这样的,昨天我和一个朋友聊天,他说他自己有一台云服务器运行了 Redis 数据库,有一天突然发现数据库里的**数据全没了**,只剩下一个奇奇怪怪的键值对,其中值看起来像一个 RSA 公钥的字符串,他以为是误操作删库了,幸好自己的服务器里没啥重要的数据,也就没在意。 22 | 23 | 经过一番攀谈交心了解到,他跑了一个比较古老已经停止维护的开源项目,安装的旧版本的 Redis,而且他对 Linux 的使用不是很熟练。我就知道,他的服务器已经被攻陷了,想到也许还会有不少像我这位朋友的人,不重视操作系统的权限、防火墙的设置和数据库的保护,我就写一篇文章简单看看这种情况出现的原因,以及如何防范。 24 | 25 | PS:这种手法现在已经行不通了,因为新版本 Redis 都增加了 protect mode,增加了安全性,我们只能在本地简单模拟一下,就别乱试了。 26 | 27 | ### 事件经过 28 | 29 | 其实这种攻击手法都是 2015 年的事了,那时候 Redis 的安全保护机制比较差,只能靠运维人员来合理配置以保证数据库的安全。有段时间,全球几万个 Redis 节点遭到了攻击,出现了上述奇怪的现象,所有数据被清空,只剩一个键叫 `crackit`,它的值形似 RSA 公钥的字符串。 30 | 31 | 后来查证,攻击者利用 Redis 动态设置配置和数据持久化的功能,把自己的 RSA 公钥写入到了被攻击服务器的 `/root/.ssh/authored_keys` 这个文件,从而可以用私钥直接登录对方的 root 用户,侵入对方系统。 32 | 33 | 沦陷的服务器安全防护做的很不好,具体如下: 34 | 35 | 1、Redis 的端口是默认端口,而且可以从公网访问。 36 | 37 | 2、Redis 还没设密码。 38 | 39 | 3、Redis 进程是由 root 用户启动的。 40 | 41 | 以上每个点都是比较危险的,合在一起,那真是很致命了。且不说别人把公钥写到你的系统里,就说连上你的数据库然后删库,那损失都够大了。那么具体的流程是什么呢,下面我在本地回环地址上简单演示一下。 42 | 43 | ### 本地演示 44 | 45 | Redis 监听的默认端口是 6379,我们设置它接收网卡 127.0.0.1 的连接,这样我从本地肯定可以连接 Redis,以此模拟「从公网可以访问 Redis」这一条件。 46 | 47 | 现在我是名叫 fdl 的普通用户,我想用 ssh 登录我系统上的 root 用户,要输入 root 的密码,我不知道,所以没办法登录。 48 | 49 | 除了密码登录之外,还可以使用 RSA 密钥对登录,但是必须要把我的公钥存到 root 的家目录中 `/root/.ssh/authored_keys`。我们知道 `/root` 目录的权限设置是不允许任何其他用户闯入读写的: 50 | 51 | ![](../pictures/redis入侵/1.png) 52 | 53 | 但是,我发现自己竟然可以直接访问 Redis: 54 | 55 | ![](../pictures/redis入侵/2.png) 56 | 57 | 如果 Redis 是以 root 的身份运行的,那么我就可以通过操作 Redis,让它把我的公钥写到 root 的家目录中。Redis 有一种持久化方式是生成 RDB 文件,其中会包含原始数据。 58 | 59 | 我露出了邪恶的微笑,先把 Redis 中的数据全部清空,然后把我的 RSA 公钥写到数据库里,这里在开头和结尾加换行符目的是避免 RDB 文件生成过程中损坏到公钥字符串: 60 | 61 | ![](../pictures/redis入侵/3.png) 62 | 63 | 命令 Redis 把生成的数据文件保存到 `/root/.ssh/` 中的 `authored_keys` 文件中: 64 | 65 | ![](../pictures/redis入侵/4.png) 66 | 67 | 现在,root 的家目录中已经包含了我们的 RSA 公钥,我们现在可以通过密钥对登录进 root 了: 68 | 69 | ![](../pictures/redis入侵/5.png) 70 | 71 | 看一下刚才写入 root 家的公钥: 72 | 73 | ![](../pictures/redis入侵/6.png) 74 | 75 | 乱码是 GDB 文件的某种编码吧,但是中间的公钥被完整保存了,而且 ssh 登录程序竟然也识别了这段被乱码包围的公钥! 76 | 77 | 至此,拥有了 root 权限,就可以为所欲为了。。。 78 | 79 | ### 吸取教训 80 | 81 | 虽然现在基本不会受到这种攻击(新版本的 Redis 没有密码时默认不对外网开放),但是对于系统的安全性是每个人都应该重视的。 82 | 83 | 我们自己折腾东西,用个低配云服务器,为了省事儿一般也不认真配置防火墙,数据库不设密码或者设成 admin、root 这样简单的密码,反正也没啥数据。这样肯定不是个好习惯。 84 | 85 | 现在我们的计算机系统越来越完善,每个成熟的项目都由最优秀的一帮人维护,从技术上说应该算是无懈可击了,那么唯一可能出问题的地方就在于使用它们的人。 86 | 87 | 就像经常看到有人的 QQ 被盗,我相信盗号的人肯定不是跑到腾讯的数据库里盗号,肯定是 QQ 号主安全防范意识差,在哪个钓鱼网站输入了自己的账号密码,导致被盗。我基本没见过微信被盗的,可能是微信弱化密码登录,改用二维码扫描登录的原因。这应该也算是一种安全方面的考量吧,毕竟微信是有支付功能的。 88 | 89 | 上面这种骗局对于技术人来说,看看 url,浏览器分析一下网络包就很容易识别出来,但是你还别不信,一般人真的搞不明白怎么识别钓鱼网站和官方网站。就像我真没想到都 2020 年了,还有人在找 Redis 的这个漏洞,而且还有人中招。。。 90 | 91 | 那么说回 Redis 数据库的使用,在官网上明确写出了安全防护的建议,我简单总结一下吧: 92 | 93 | 1、不要用 root 用户启动 Redis Server,而且一定要设置密码,而且密码不要太短,否则容易被暴力破解。 94 | 95 | 2、配置服务器防火墙和 Redis 的 config 文件,尽量不要让 Redis 与外界接触。 96 | 97 | 3、利用 rename 功能伪装 flushall 这种危险命令,以防被删库,丢失数据。 98 | 99 | **_____________** 100 | 101 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 102 | 103 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 104 | 105 |

106 | 107 |

108 | 109 | ======其他语言代码====== -------------------------------------------------------------------------------- /技术/session和cookie.md: -------------------------------------------------------------------------------- 1 | # 一文读懂 session 和 cookie 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [如何计算完全二叉树的节点数](https://labuladong.gitee.io/algo/) 15 | * [Linux的进程、线程、文件描述符是什么](https://labuladong.gitee.io/algo/) 16 | 17 | **-----------** 18 | 19 | cookie 大家应该都熟悉,比如说登录某些网站一段时间后,就要求你重新登录;再比如有的同学很喜欢玩爬虫技术,有时候网站就是可以拦截住你的爬虫,这些都和 cookie 有关。如果你明白了服务器后端对于 cookie 和 session 的处理逻辑,就可以解释这些现象,甚至钻一些空子无限白嫖,待我慢慢道来。 20 | 21 | ### 一、session 和 cookie 简介 22 | 23 | cookie 的出现是因为 HTTP 是无状态的一种协议,换句话说,服务器记不住你,可能你每刷新一次网页,就要重新输入一次账号密码进行登录。这显然是让人无法接受的,cookie 的作用就好比服务器给你贴个标签,然后你每次向服务器再发请求时,服务器就能够 cookie 认出你。 24 | 25 | 抽象地概括一下:**一个 cookie 可以认为是一个「变量」,形如 `name=value`,存储在浏览器;一个 session 可以理解为一种数据结构,多数情况是「映射」(键值对),存储在服务器上**。 26 | 27 | 注意,我说的是「一个」cookie 可以认为是一个变量,但是服务器可以一次设置多个 cookie,所以有时候说 cookie 是「一组」键值对儿,这也可以说得通。 28 | 29 | cookie 可以在服务器端通过 HTTP 的 SetCookie 字段设置 cookie,比如我用 Go 语言写的一个简单服务: 30 | 31 | ```go 32 | func cookie(w http.ResponseWriter, r *http.Request) { 33 | // 设置了两个 cookie 34 | http.SetCookie(w, &http.Cookie{ 35 | Name: "name1", 36 | Value: "value1", 37 | }) 38 | 39 | http.SetCookie(w, &http.Cookie{ 40 | Name: "name2", 41 | Value: "value2", 42 | }) 43 | // 将字符串写入网页 44 | fmt.Fprintln(w, "页面内容") 45 | } 46 | ``` 47 | 48 | 当浏览器访问对应网址时,通过浏览器的开发者工具查看此次 HTTP 通信的细节,可以看见服务器的回应发出了两次 `SetCookie` 命令: 49 | 50 | ![](../pictures/session/1.png) 51 | 52 | 在这之后,浏览器的请求中的 `Cookie` 字段就带上了这两个 cookie: 53 | 54 | ![](../pictures/session/2.png) 55 | 56 | **cookie 的作用其实就是这么简单,无非就是服务器给每个客户端(浏览器)打的标签**,方便服务器辨认而已。当然,HTTP 还有很多参数可以设置 cookie,比如过期时间,或者让某个 cookie 只有某个特定路径才能使用等等。 57 | 58 | 但问题是,我们也知道现在的很多网站功能很复杂,而且涉及很多的数据交互,比如说电商网站的购物车功能,信息量大,而且结构也比较复杂,无法通过简单的 cookie 机制传递这么多信息,而且要知道 cookie 字段是存储在 HTTP header 中的,就算能够承载这些信息,也会消耗很多的带宽,比较消耗网络资源。 59 | 60 | session 就可以配合 cookie 解决这一问题,比如说一个 cookie 存储这样一个变量 `sessionID=xxxx`,仅仅把这一个 cookie 传给服务器,然后服务器通过这个 ID 找到对应的 session,这个 session 是一个数据结构,里面存储着该用户的购物车等详细信息,服务器可以通过这些信息返回该用户的定制化网页,有效解决了追踪用户的问题。 61 | 62 | **session 是一个数据结构,由网站的开发者设计,所以可以承载各种数据**,只要客户端的 cookie 传来一个唯一的 session ID,服务器就可以找到对应的 session,认出这个客户。 63 | 64 | 当然,由于 session 存储在服务器中,肯定会消耗服务器的资源,所以 session 一般都会有一个过期时间,服务器一般会定期检查并删除过期的 session,如果后来该用户再次访问服务器,可能就会面临重新登录等等措施,然后服务器新建一个 session,将 session ID 通过 cookie 的形式传送给客户端。 65 | 66 | 那么,我们知道 cookie 和 session 的原理,有什么切实的好处呢?**除了应对面试,我给你说一个鸡贼的用处,就是可以白嫖某些服务**。 67 | 68 | 有些网站,你第一次使用它的服务,它直接免费让你试用,但是用一次之后,就让你登录然后付费继续使用该服务。而且你发现网站似乎通过某些手段记住了你的电脑,除非你换个电脑或者换个浏览器才能再白嫖一次。 69 | 70 | 那么问题来了,你试用的时候没有登录,网站服务器是怎么记住你的呢?这就很显然了,服务器一定是给你的浏览器打了 cookie,后台建立了对应的 session 记录你的状态。你的浏览器在每次访问该网站的时候都会听话地带着 cookie,服务器一查 session 就知道这个浏览器已经免费使用过了,得让它登录付费,不能让它继续白嫖了。 71 | 72 | 那如果我不让浏览器发送 cookie,每次都伪装成一个第一次来试用的小萌新,不就可以不断白嫖了么?浏览器会把网站的 cookie 以文件的形式存在某些地方(不同的浏览器配置不同),你把他们找到然后删除就行了。但是对于 Firefox 和 Chrome 浏览器,有很多插件可以直接编辑 cookie,比如我的 Chrome 浏览器就用的一款叫做 EditThisCookie 的插件,这是他们官网: 73 | 74 | ![http://www.editthiscookie.com/](../pictures/session/3.png) 75 | 76 | 这类插件可以读取浏览器在当前网页的 cookie,点开插件可以任意编辑和删除 cookie。**当然,偶尔白嫖一两次还行,不鼓励高频率白嫖,想常用还是掏钱吧,否则网站赚不到钱,就只能取消免费试用这个机制了**。 77 | 78 | 以上就是关于 cookie 和 session 的简单介绍,cookie 是 HTTP 协议的一部分,不算复杂,而 session 是可以定制的,所以下面详细看一下实现 session 管理的代码架构吧。 79 | 80 | ### 二、session 的实现 81 | 82 | session 的原理不难,但是具体实现它可是很有技巧的,一般需要三个组件配合完成,它们分别是 `Manager`、`Provider` 和 `Session` 三个类(接口)。 83 | 84 | ![](../pictures/session/4.jpg) 85 | 86 | 1、浏览器通过 HTTP 协议向服务器请求路径 `/content` 的网页资源,对应路径上有一个 Handler 函数接收请求,解析 HTTP header 中的 cookie,得到其中存储的 sessionID,然后把这个 ID 发给 `Manager`。 87 | 88 | 2、`Manager` 充当一个 session 管理器的角色,主要存储一些配置信息,比如 session 的存活时间,cookie 的名字等等。而所有的 session 存在 `Manager` 内部的一个 `Provider` 中。所以 `Manager` 会把 `sid`(sessionID)传递给 `Provider`,让它去找这个 ID 对应的具体是哪个 session。 89 | 90 | 3、`Provider` 就是一个容器,最常见的应该就是一个散列表,将每个 `sid` 和对应的 session 一一映射起来。收到 `Manager` 传递的 `sid` 之后,它就找到 `sid` 对应的 session 结构,也就是 `Session` 结构,然后返回它。 91 | 92 | 4、`Session` 中存储着用户的具体信息,由 Handler 函数中的逻辑拿出这些信息,生成该用户的 HTML 网页,返回给客户端。 93 | 94 | 那么你也许会问,为什么搞这么麻烦,直接在 Handler 函数中搞一个哈希表,然后存储 `sid` 和 `Session` 结构的映射不就完事儿了? 95 | 96 | **这就是设计层面的技巧了**,下面就来说说,为什么分成 `Manager`、`Provider` 和 `Session`。 97 | 98 | 99 | 先从最底层的 `Session` 说。既然 session 就是键值对,为啥不直接用哈希表,而是要抽象出这么一个数据结构呢? 100 | 101 | 第一,因为 `Session` 结构可能不止存储了一个哈希表,还可以存储一些辅助数据,比如 `sid`,访问次数,过期时间或者最后一次的访问时间,这样便于实现想 LRU、LFU 这样的算法。 102 | 103 | 第二,因为 session 可以有不同的存储方式。如果用编程语言内置的哈希表,那么 session 数据就是存储在内存中,如果数据量大,很容易造成程序崩溃,而且一旦程序结束,所有 session 数据都会丢失。所以可以有很多种 session 的存储方式,比如存入缓存数据库 Redis,或者存入 MySQL 等等。 104 | 105 | 因此,`Session` 结构提供一层抽象,屏蔽不同存储方式的差异,只要提供一组通用接口操纵键值对: 106 | 107 | ```go 108 | type Session interface { 109 | // 设置键值对 110 | Set(key, val interface{}) 111 | // 获取 key 对应的值 112 | Get(key interface{}) interface{} 113 | // 删除键 key 114 | Delete(key interface{}) 115 | } 116 | ``` 117 | 118 | 再说 `Provider` 为啥要抽象出来。我们上面那个图的 `Provider` 就是一个散列表,保存 `sid` 到 `Session` 的映射,但是实际中肯定会更加复杂。我们不是要时不时删除一些 session 吗,除了设置存活时间之外,还可以采用一些其他策略,比如 LRU 缓存淘汰算法,这样就需要 `Provider` 内部使用哈希链表这种数据结构来存储 session。 119 | 120 | PS:关于 LRU 算法的奥妙,参见前文「LRU 算法详解」。 121 | 122 | 因此,`Provider` 作为一个容器,就是要屏蔽算法细节,以合理的数据结构和算法组织 `sid` 和 `Session` 的映射关系,只需要实现下面这几个方法实现对 session 的增删查改: 123 | 124 | ```go 125 | type Provider interface { 126 | // 新增并返回一个 session 127 | SessionCreate(sid string) (Session, error) 128 | // 删除一个 session 129 | SessionDestroy(sid string) 130 | // 查找一个 session 131 | SessionRead(sid string) (Session, error) 132 | // 修改一个session 133 | SessionUpdate(sid string) 134 | // 通过类似 LRU 的算法回收过期的 session 135 | SessionGC(maxLifeTime int64) 136 | } 137 | ``` 138 | 139 | 140 | 最后说 `Manager`,大部分具体工作都委托给 `Session` 和 `Provider` 承担了,`Manager` 主要就是一个参数集合,比如 session 的存活时间,清理过期 session 的策略,以及 session 的可用存储方式。`Manager` 屏蔽了操作的具体细节,我们可以通过 `Manager` 灵活地配置 session 机制。 141 | 142 | 综上,session 机制分成几部分的最主要原因就是解耦,实现定制化。我在 Github 上看过几个 Go 语言实现的 session 服务,源码都很简单,有兴趣的朋友可以学习学习: 143 | 144 | https://github.com/alexedwards/scs 145 | 146 | https://github.com/astaxie/build-web-application-with-golang 147 | 148 | **_____________** 149 | 150 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 151 | 152 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 153 | 154 |

155 | 156 |

157 | 158 | ======其他语言代码====== -------------------------------------------------------------------------------- /技术/在线练习平台.md: -------------------------------------------------------------------------------- 1 | # 在线刷题学习平台 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [区间调度之区间合并问题](https://labuladong.gitee.io/algo/) 15 | * [别再说你不懂Linux内存管理了,10张图给你安排的明明白白](https://labuladong.gitee.io/algo/) 16 | 17 | **-----------** 18 | 19 | 虽说我没事就喜欢喷应试教育,但我也从应试教育中发现了一个窍门:如果能够以刷题的形式学习某项技能,效率和效果是最佳的。对于技术的学习,我经常面临的困境是,**理论知识知道的不少,但是有的场景实在无法模拟,缺少亲自动手实践的机会**,如果能有一本带标准答案的习题册让我刷刷就好了。 20 | 21 | 所以在学习新技术时,我首先会去搜索是否有在线刷题平台,你还别说,有的大神真就做了很不错的在线练习平台,下面就介绍几个平台,分别是学习 Git、SQL、正则表达式的在线练习平台。 22 | 23 | ### 一、练习 Git 24 | 25 | 这是个叫做 Learning Git Branching 的项目,是我一定要推荐的: 26 | 27 | ![](../pictures/online/1.png) 28 | 29 | 正如对话框中的自我介绍,这确实也是我至今发现的**最好**的 Git 动画教程,没有之一。 30 | 31 | 想当年我用 Git 就会 `add .`,`clone`,`push`,`pull`,`commit` 几个命令,其他的命令完全不会,Git 就是一个下载器,Github 就是个资源网站加免费图床,命令能不能达成目的都是靠运气。什么版本控制,我根本搞不懂,也懒得去看那一堆乱七八糟的文档。 32 | 33 | 这个网站的教程不是给你举那种修改文件的细节例子,而是将每次 `commit` 都抽象成树的节点,**用动画闯关的形式**,让你自由使用 Git 命令完成目标: 34 | 35 | ![](../pictures/online/2.png) 36 | 37 | 所有 Git 分支都被可视化了,你只要在左侧的命令行输入 Git 命令,分支会进行相应的变化,只要达成任务目标,你就过关啦!网站还会记录你的命令数,试试能不能以最少的命令数过关! 38 | 39 | ![](../pictures/online/3.png) 40 | 41 | 我一开始以为这个教程只包含本地 Git 仓库的版本管理,**后来我惊奇地发现它还有远程仓库的操作教程**! 42 | 43 | ![](../pictures/online/4.png) 44 | 45 | ![](../pictures/online/5.png) 46 | 47 | 真的跟玩游戏一样,难度设计合理,流畅度很好,我一玩都停不下来了,几小时就打通了,哈哈哈! 48 | 49 | ![](../pictures/online/6.png) 50 | 51 | 总之,这个教程很适合初学和进阶,如果你觉得自己对 Git 的掌握还不太好,用 Git 命令还是靠碰运气,就可以玩玩这个教程,相信能够让你更熟练地使用 Git。 52 | 53 | 它是一个开源项目,Github 项目地址: 54 | 55 | https://github.com/pcottle/learnGitBranching 56 | 57 | 教程网站地址: 58 | 59 | https://learngitbranching.js.org 60 | 61 | ### 二、练习正则表达式 62 | 63 | **正则表达式是个非常强有力的工具**,可以说计算机中的一切数据都是字符,借助正则表达式这种模式匹配工具,操作计算机可以说是如虎添翼。 64 | 65 | 我这里要推荐两个网站,一个是练习平台,一个是测试正则表达式的平台。 66 | 67 | 先说练习平台,叫做 RegexOne: 68 | 69 | ![](../pictures/online/9.png) 70 | 71 | 前面有基本教程,后面有一些常见的正则表达式题目,比如判断邮箱、URL、电话号,或者抽取日志的关键信息等等。 72 | 73 | 只要写出符合要求的正则表达式,就可以进入下一个问题,关键是每道题还有标准答案,可以点击下面的 solution 按钮查看: 74 | 75 | ![](../pictures/online/10.png) 76 | 77 | RegexOne 网址: 78 | 79 | https://regexone.com/ 80 | 81 | 再说测试工具,是个叫做 RegExr 的 Github 项目,这是它的网站: 82 | 83 | ![](../pictures/online/11.png) 84 | 85 | 可以看见,输入文本和正则模式串后,**网站会给正则表达式添加好看且容易辨认的样式,自动在文本中搜索模式串,高亮显示匹配的字符串,并且还会显示每个分组捕获的字符串**。 86 | 87 | 这个网站可以配合前面的正则练习平台使用,在这里尝试各种表达式,成功匹配之后粘贴过去。 88 | 89 | RegExr 网址: 90 | 91 | https://regexr.com/ 92 | 93 | ### 三、练习 SQL 94 | 95 | 这是一个叫做 SQLZOO 的网站,左侧是所有的练习内容: 96 | 97 | ![](../pictures/online/7.png) 98 | 99 | SQLZOO 是一款很好用的 SQL 练习平台,英文不难理解,可以直接看英文版,但是也可以切换繁体中文,比较友好。 100 | 101 | 这里都是比较常用的 SQL 命令,给你一个需求,你写 SQL 语句实现正确的查询结果。**最重要的是,这里不仅对每个命令的用法有详细解释,每个专题后面还有选择题(quiz),而且有判题系统,甚至有的比较难的题目还有视频讲解**: 102 | 103 | ![](../pictures/online/8.png) 104 | 105 | 至于难度,循序渐进,即便对新手也很友好,靠后的问题确实比较有技巧性,相信这是热爱思维挑战的人喜欢的!LeetCode 也有 SQL 相关的题目,不过难度一般比较大,我觉得 SQLZOO 刷完基础 SQL 命令再去 LeetCode 刷比较合适。 106 | 107 | 网站地址: 108 | 109 | https://sqlzoo.net/ 110 | 111 | 112 | **_____________** 113 | 114 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 115 | 116 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 117 | 118 |

119 | 120 |

121 | 122 | ======其他语言代码====== -------------------------------------------------------------------------------- /数据结构系列/README.md: -------------------------------------------------------------------------------- 1 | # 数据结构系列 2 | 3 | 这一章主要是一些特殊的数据结构设计,比如单调栈解决 Next Greater Number,单调队列解决滑动窗口问题;还有常用数据结构的操作,比如链表、树、二叉堆。 4 | 5 | 欢迎关注我的公众号 labuladong,查看全部文章: 6 | 7 | ![labuladong二维码](../pictures/qrcode.jpg) -------------------------------------------------------------------------------- /算法思维系列/README.md: -------------------------------------------------------------------------------- 1 | # 算法思维系列 2 | 3 | 本章包含一些常用的算法技巧,比如前缀和、回溯思想、位操作、双指针、如何正确书写二分查找等等。 4 | 5 | 欢迎关注我的公众号 labuladong,查看全部文章: 6 | 7 | ![labuladong二维码](../pictures/table_qr2.jpg) 8 | ![labuladong二维码](../pictures/qrcode.jpg) -------------------------------------------------------------------------------- /算法思维系列/为什么推荐算法4.md: -------------------------------------------------------------------------------- 1 | # 为什么我推荐《算法4》 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [递归反转链表的一部分](https://labuladong.gitee.io/algo/) 15 | * [25 张图解:键入网址后,到网页显示,其间发生了什么](https://labuladong.gitee.io/algo/) 16 | 17 | **-----------** 18 | 19 | 通知:如果本站对你学习算法有帮助,**请收藏网址,并推荐给你的朋友**。由于 **labuladong** 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜。我这免费写给你看,**多宣传原创作者是你唯一能做的**,谁也不希望劣币驱逐良币对吧? 20 | 21 | 咱们的公众号有很多硬核的算法文章,今天就聊点轻松的,就具体聊聊我非常“鼓吹”的《算法4》。这本书我在之前的文章多次推荐过,但是没有具体的介绍,今天就来正式介绍一下。。 22 | 23 | 我的推荐不会直接甩一大堆书目,而是会联系实际生活,讲一些书中有趣有用的知识,无论你最后会不会去看这本书,本文都会给你带来一些收获。 24 | 25 | **首先这本书是适合初学者的**。总是有很多读者问,我只会 C 语言,能不能看《算法4》?学算法最好用什么语言?诸如此类的问题。 26 | 27 | 经常看咱们公众号的读者应该体会到了,算法其实是一种思维模式,和你用什么语言没啥关系。我们的文章也不会固定用某一种语言,而是什么语言写出来容易理解就用什么语言。再退一步说,到底适不适合你,网上找个 PDF 亲自看一下不就知道了? 28 | 29 | 《算法4》看起来挺厚的,但是前面几十页是教你 Java 的;每章后面还有习题,占了不少页数;每章还有一些数学证明,这些都可以忽略。这样算下来,剩下的就是基础知识和疑难解答之类的内容,含金量很高,把这些基础知识动手实践一遍,真的就可以达到不错的水平了。 30 | 31 | 我觉得这本书之所以能有这么高的评分,一个是因为讲解详细,还有大量配图,另一个原因就是书中把一些算法和现实生活中的使用场景联系起来,你不仅知道某个算法怎么实现,也知道它大概能运用到什么场景,下面我就来介绍两个图算法的简单应用。 32 | 33 | ### 一、二分图的应用 34 | 35 | 我想举的第一个例子是**二分图**。简单来说,二分图就是一幅拥有特殊性质的图:能够用两种颜色为所有顶点着色,使得任何一条边的两个顶点颜色不同。 36 | 37 | ![](../pictures/algo4/1.jpg) 38 | 39 | 明白了二分图是什么,能解决什么实际问题呢?**算法方面,常见的操作是如何判定一幅图是不是二分图**。比如说下面这道 LeetCode 题目: 40 | 41 | ![](../pictures/algo4/title.png) 42 | 43 | 你想想,如果我们把每个人视为一个顶点,边代表讨厌;相互讨厌的两个人之间连接一条边,就可以形成一幅图。那么根据刚才二分图的定义,如果这幅图是一幅二分图,就说明这些人可以被分为两组,否则的话就不行。 44 | 45 | 这是判定二分图算法的一个应用,**其实二分图在数据结构方面也有一些不错的特性**。 46 | 47 | 比如说我们需要一种数据结构来储存电影和演员之间的关系:某一部电影肯定是由多位演员出演的,且某一位演员可能会出演多部电影。你使用什么数据结构来存储这种关系呢? 48 | 49 | 既然是存储映射关系,最简单的不就是使用哈希表嘛,我们可以使用一个 `HashMap>` 来存储电影到演员列表的映射,如果给一部电影的名字,就能快速得到出演该电影的演员。 50 | 51 | 但是如果给出一个演员的名字,我们想快速得到该演员演出的所有电影,怎么办呢?这就需要「反向索引」,对之前的哈希表进行一些操作,新建另一个哈希表,把演员作为键,把电影列表作为值。 52 | 53 | 对于上面这个例子,可以使用二分图来取代哈希表。电影和演员是具有二分图性质的:如果把电影和演员视为图中的顶点,出演关系作为边,那么与电影顶点相连的一定是演员,与演员相邻的一定是电影,不存在演员和演员相连,电影和电影相连的情况。 54 | 55 | 回顾二分图的定义,如果对演员和电影顶点着色,肯定就是一幅二分图: 56 | 57 | ![](../pictures/algo4/2.jpg) 58 | 59 | 如果这幅图构建完成,就不需要反向索引,对于演员顶点,其直接连接的顶点就是他出演的电影,对于电影顶点,其直接连接的顶点就是出演演员。 60 | 61 | 当然,对于这个问题,书中还提到了一些其他有趣的玩法,比如说社交网络中「间隔度数」的计算(六度空间理论应该听说过)等等,其实就是一个 BFS 广度优先搜索寻找最短路径的问题,具体代码实现这里就不展开了。 62 | 63 | ### 二、套汇的算法 64 | 65 | 如果我们说货币 A 到货币 B 的汇率是 10,意思就是 1 单位的货币 A 可以换 10 单位货币 B。如果我们把每种货币视为一幅图的顶点,货币之间的汇率视为加权有向边,那么整个汇率市场就是一幅「完全加权有向图」。 66 | 67 | 一旦把现实生活中的情景抽象成图,就有可能运用算法解决一些问题。比如说图中可能存在下面的情况: 68 | 69 | ![](../pictures/algo4/3.jpg) 70 | 71 | 图中的加权有向边代表汇率,我们可以发现如果把 100 单位的货币 A 换成 B,再换成 C,最后换回 A,就可以得到 100×0.9×0.8×1.4 = 100.8 单位的 A!如果交易的金额大一些的话,赚的钱是很可观的,这种空手套白狼的操作就是套汇。 72 | 73 | 现实中交易会有种种限制,而且市场瞬息万变,但是套汇的利润还是很高的,关键就在于如何**快速**找到这种套汇机会呢? 74 | 75 | 借助图的抽象,我们发现套汇机会其实就是一个环,且这个环上的权重之积大于 1,只要在顺着这个环交易一圈就能空手套白狼。 76 | 77 | 图论中有一个经典算法叫做 **Bellman-Ford 算法,可以用于寻找负权重环**。对于我们说的套汇问题,可以先把所有边的权重 w 替换成 -ln(w),这样「寻找权重乘积大于 1 的环」就转化成了「寻找权重和小于 0 的环」,就可以使用 Bellman-Ford 算法在 O(EV) 的时间内寻找负权重环,也就是寻找套汇机会。 78 | 79 | 《算法4》就介绍到这里,关于上面两个例子的具体内容,可以自己去看书,**公众号后台回复关键词「算法4」就有 PDF**。 80 | 81 | 82 | ### 三、最后说几句 83 | 84 | 首先,前文说对于数学证明、章后习题可以忽略,可能有人要抬杠了:难道习题和数学证明不重要吗? 85 | 86 | 那我想说,就是不重要,起码对大多数人来说不重要。我觉得吧,学习就要带着目的性去学,大部分人学算法不就是巩固计算机知识,对付面试题目吗?**如果是这个目的**,那就学些基本的数据结构和经典算法,明白它们的时间复杂度,然后去刷题就好了,何必和习题、证明过不去? 87 | 88 | 这也是我从来不推荐《算法导论》这本书的原因。如果有人给你推荐这本书,只可能有两个原因,要么他是真大佬,要么他在装大佬。《算法导论》中充斥大量数学证明,而且很多数据结构是很少用到的,顶多当个字典用。你说你学了那些有啥用呢,饶过自己呗。 89 | 90 | 另外,读书在精不在多。你花时间《算法4》过个大半(最后小半部分有点困难),同时刷点题,看看咱们的公众号文章,算法这块真就够了,别对细节问题太较真。 91 | 92 | 93 | 94 | **_____________** 95 | 96 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 97 | 98 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 99 | 100 |

101 | 102 |

103 | 104 | ======其他语言代码====== -------------------------------------------------------------------------------- /算法思维系列/几个反直觉的概率问题.md: -------------------------------------------------------------------------------- 1 | # 几个反直觉的概率问题 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [学习算法和数据结构的思路指南](https://labuladong.gitee.io/algo/) 15 | * [我写了首诗,让你闭着眼睛也能写对二分搜索](https://labuladong.gitee.io/algo/) 16 | 17 | **-----------** 18 | 19 | 上篇文章 [洗牌算法详解](https://labuladong.gitee.io/algo/) 讲到了验证概率算法的蒙特卡罗方法,今天聊点轻松的内容:几个和概率相关的有趣问题。 20 | 21 | 计算概率有下面两个最简单的原则: 22 | 23 | 原则一、计算概率一定要有一个参照系,称作「样本空间」,即随机事件可能出现的所有结果。事件 A 发生的概率 = A 包含的样本点 / 样本空间的样本总数。 24 | 25 | 原则二、计算概率一定要明白,概率是一个连续的整体,不可以把连续的概率分割开,也就是所谓的条件概率。 26 | 27 | 上述两个原则高中就学过,但是我们还是很容易犯错,而且犯错的流程也有异曲同工之妙: 28 | 29 | 先是忽略了原则二,错误地计算了样本空间,然后通过原则一算出了错误的答案。 30 | 31 | 下面介绍几个简单却具有迷惑性的问题,分别是男孩女孩问题、生日悖论、三门问题。当然,三门问题可能是大家最耳熟的,所以就多说一些有趣的思考。 32 | 33 | 34 | ### 一、男孩女孩问题 35 | 36 | 假设有一个家庭,有两个孩子,现在告诉你其中有一个男孩,请问另一个也是男孩的概率是多少? 37 | 38 | 很多人,包括我在内,不假思索地回答:1/2 啊,因为另一个孩子要么是男孩,要么是女孩,而且概率相等呀。但是实际上,答案是 1/3。 39 | 40 | 上述思想为什么错误呢?因为没有正确计算样本空间,导致原则一计算错误。有两个孩子,那么样本空间为 4,即哥哥妹妹,哥哥弟弟,姐姐妹妹,姐姐弟弟这四种情况。已知有一个男孩,那么排除姐姐妹妹这种情况,所以样本空间变成 3。另一个孩子也是男孩只有哥哥弟弟这 1 种情况,所以概率为 1/3。 41 | 42 | 为什么计算样本空间会出错呢?因为我们忽略了条件概率,即混淆了下面两个问题: 43 | 44 | 这个家庭只有一个孩子,这个孩子是男孩的概率是多少? 45 | 46 | 这个家庭有两个孩子,其中一个是男孩,另一个孩子是男孩的概率是多少? 47 | 48 | 根据原则二,概率问题是连续的,不可以把上述两个问题混淆。第二个问题需要用条件概率,即求一个孩子是男孩的条件下,另一个也是男孩的概率。运用条件概率的公式也很好算,就不多说了。 49 | 50 | 通过这个问题,读者应该理解两个概率计算原则的关系了,最具有迷惑性的就是条件概率的忽视。为了不要被迷惑,最简单的办法就是把所有可能结果穷举出来。 51 | 52 | 最后,对于此问题我见过一个很奇葩的质疑:如果这两个孩子是双胞胎,不存在年龄上的差异怎么办? 53 | 54 | 我竟然觉得有那么一丝道理!但其实,我们只是通过年龄差异来表示两个孩子的独立性,也就是说即便两个孩子同性,也有两种可能。所以不要用双胞胎抬杠了。 55 | 56 | 57 | ### 二、生日悖论 58 | 59 | 生日悖论是由这样一个问题引出的:一个屋子里需要有多少人,才能使得存在至少两个人生日是同一天的概率达到 50%? 60 | 61 | 答案是 23 个人,也就是说房子里如果有 23 个人,那么就有 50% 的概率会存在两个人生日相同。这个结论看起来不可思议,所以被称为悖论。按照直觉,要得到 50% 的概率,起码得有 183 个人吧,因为一年有 365 天呀?其实不是的,觉得这个结论不可思议主要有两个思维误区: 62 | 63 | **第一个误区是误解「存在」这个词的含义。** 64 | 65 | 读者可能认为,如果 23 个人中出现相同生日的概率就能达到 50%,是不是意味着: 66 | 67 | 假设现在屋子里坐着 22 个人,然后我走进去,那么有 50% 的概率我可以找到一个人和我生日相同。但这怎么可能呢? 68 | 69 | 并不是的,你这种想法是以自我为中心,而题目的概率是在描述整体。也就是说「存在」的含义是指 23 人中的任意两个人,涉及排列组合,大概率和你没啥关系。 70 | 71 | 如果你非要计算存在和自己生日相同的人的概率是多少,可以这样计算: 72 | 73 | 1 - P(22 个人都和我的生日不同) = 1 -(364/365)^22 = 0.06 74 | 75 | 这样计算得到的结果是不是看起来合理多了?生日悖论计算对象的不是某一个人,而是一个整体,其中包含了所有人的排列组合,它们的概率之和当然会大得多。 76 | 77 | **第二个误区是认为概率是线性变化的。** 78 | 79 | 读者可能认为,如果 23 个人中出现相同生日的概率就能达到 50%,是不是意味着 46 个人的概率就能达到 100%? 80 | 81 | 不是的,就像中奖率 50% 的游戏,你玩两次的中奖率就是 100% 吗?显然不是,你玩两次的中奖率是 75%: 82 | 83 | `P(两次能中奖) = P(第一次就中了) + P(第一次没中但第二次中了) = 1/2 + 1/2*1/2 = 75%` 84 | 85 | 那么换到生日悖论也是一个道理,概率不是简单叠加,而要考虑一个连续的过程,所以这个结论并没有什么不合常理之处。 86 | 87 | 那为什么只要 23 个人出现相同生日的概率就能大于 50% 了呢?我们先计算 23 个人生日都唯一(不重复)的概率。只有 1 个人的时候,生日唯一的概率是 `365/365`,2 个人时,生日唯一的概率是 `365/365 × 364/365`,以此类推可知 23 人的生日都唯一的概率: 88 | 89 | 90 | ![](../pictures/概率问题/p.png) 91 | 92 | 算出来大约是 0.493,所以存在相同生日的概率就是 0.507,差不多就是 50% 了。实际上,按照这个算法,当人数达到 70 时,存在两个人生日相同的概率就上升到了 99.9%,基本可以认为是 100% 了。所以从概率上说,一个几十人的小团体中存在生日相同的人真没啥稀奇的。 93 | 94 | ### 三、三门问题 95 | 96 | 这个游戏很经典了:游戏参与者面对三扇门,其中两扇门后面是山羊,一扇门后面是跑车。参与者只要随便选一扇门,门后面的东西就归他(跑车的价值当然更大)。但是主持人决定帮一下参与者:在他选择之后,先不急着打开这扇门,而是由主持人打开剩下两扇门中的一扇,展示其中的山羊(主持人知道每扇门后面是什么),然后给参与者一次换门的机会,此时参与者应该换门还是不换门呢? 97 | 98 | 为了防止第一次看到这个问题的读者迷惑,再具体描述一下这个问题: 99 | 100 | 你是游戏参与者,现在有门 1,2,3,假设你随机选择了门 1,然后主持人打开了门 3 告诉你那后面是山羊。现在,你是坚持你最初的选择门 1,还是选择换成门 2 呢? 101 | 102 | ![](../pictures/概率问题/sanmen.png) 103 | 104 | 答案是应该换门,换门之后抽到跑车的概率是 2/3,不换的话是 1/3。又一次反直觉,感觉换不换的中奖概率应该都一样啊,因为最后肯定就剩两个门,一个是羊,一个是跑车,这是事实,所以不管选哪个的概率不都是 1/2 吗? 105 | 106 | 类似前面说的男孩女孩问题,最简单稳妥的方法就是把所有可能结果穷举出来: 107 | 108 | ![穷举树](../pictures/概率问题/tree.png) 109 | 110 | 很容易看到选择换门中奖的概率是 2/3,不换的话是 1/3。 111 | 112 | 关于这个问题还有更简单的方法:主持人开门实际上在「浓缩」概率。一开始你选择到跑车的概率当然是 1/3,剩下两个门中包含跑车的概率当然是 2/3,这没啥可说的。但是主持人帮你排除了一个含有山羊的门,相当于把那 2/3 的概率浓缩到了剩下的这一扇门上。那么,你说你是抱着原来那扇 1/3 的门,还是换成那扇经过「浓缩」的 2/3 概率的门呢? 113 | 114 | 再直观一点,假设你三选一,剩下 2 扇门,再给你加入 98 扇装山羊的门,把这 100 扇门随机打乱,问你换不换?肯定不换对吧,这明摆着把概率稀释了,肯定抱着原来的那扇门是最可能中跑车的。再假设,初始有 100 扇门,你选了一扇,然后主持人在剩下 99 扇门中帮你排除 98 个山羊,问你换不换一扇门?肯定换对吧,你手上那扇门是 1%,另一扇门是 99%,或者也可以这样理解,不换只是选择了 1 扇门,换门相当于选择了 99 扇门,这样结果很明显了吧? 115 | 116 | 以上思想,也许有的读者都思考过,下面我们思考这样一个问题:假设你在决定是否换门的时候,小明破门而入,要求帮你做出选择。他完全不知道之前发生的事,他只知道面前有两扇门,一扇是跑车一扇是山羊,那么他抽中跑车的概率是多大? 117 | 118 | 当然是 1/2,这也是很多人做错三门问题的根本原因。类似生日悖论,人们总是容易以自我为中心,通过这个小明的视角来计算是否换门,这显然会进入误区。 119 | 120 | 就好比有两个箱子,一号箱子有 4 个黑球 2 个红球,二号箱子有 2 个黑球 4 个红球,随便选一个箱子,随便摸一个球,问你摸出红球的概率。 121 | 122 | 对于不知情的小明,他会随机选择一个箱子,随机摸球,摸到红球的概率是:1/2 × 2/6 + 1/2 × 4/6 = 1/2 123 | 124 | 对于知情的你,你知道在二号箱子摸球概率大,所以只在二号箱摸,摸到红球的概率是:0 × 2/6 + 1 × 4/6 = 2/3 125 | 126 | 三门问题是有指导意义的。比如你蒙选择题,先蒙了 A,后来灵机一动排除了 B 和 C,请问你是否要把 A 换成 D?答案是,换! 127 | 128 | 也许读者会问,如果只排除了一个答案,比如说 B,那么我是否应该把 A 换成 C 或者 D 呢?答案是,换! 129 | 130 | 因为按照刚才「浓缩」概率这个思想,只要进行了排除,都是在进行「浓缩」,均摊下来肯定比你一开始蒙的那个答案概率 1/4 高。比如刚才的例子,C 和 D 的正确概率都是 3/8,而你开始蒙的 A 只有 1/4。 131 | 132 | 当然,运用此策略蒙题的前提是你真的抓瞎,真的随机乱选答案,这样概率才能作为最后的杀手锏。 133 | 134 | **_____________** 135 | 136 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 137 | 138 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 139 | 140 |

141 | 142 |

143 | 144 | ======其他语言代码====== -------------------------------------------------------------------------------- /算法思维系列/前缀和技巧.md: -------------------------------------------------------------------------------- 1 | # 前缀和技巧 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [如何去除有序数组的重复元素](https://labuladong.gitee.io/algo/) 15 | * [区间调度之区间合并问题](https://labuladong.gitee.io/algo/) 16 | 17 | 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 18 | 19 | [560.和为K的子数组](https://leetcode-cn.com/problems/subarray-sum-equals-k) 20 | 21 | **-----------** 22 | 23 | 今天来聊一道简单却十分巧妙的算法问题:算出一共有几个和为 `k` 的子数组。 24 | 25 | ![](../pictures/%E5%89%8D%E7%BC%80%E5%92%8C/title.png) 26 | 27 | 那我把所有子数组都穷举出来,算它们的和,看看谁的和等于 `k` 不就行了。 28 | 29 | 关键是,**如何快速得到某个子数组的和呢**,比如说给你一个数组 `nums`,让你实现一个接口 `sum(i, j)`,这个接口要返回 `nums[i..j]` 的和,而且会被多次调用,你怎么实现这个接口呢? 30 | 31 | 因为接口要被多次调用,显然不能每次都去遍历 `nums[i..j]`,有没有一种快速的方法在 O(1) 时间内算出 `nums[i..j]` 呢?这就需要**前缀和**技巧了。 32 | 33 | ### 一、什么是前缀和 34 | 35 | 前缀和的思路是这样的,对于一个给定的数组 `nums`,我们额外开辟一个前缀和数组进行预处理: 36 | 37 | ```java 38 | int n = nums.length; 39 | // 前缀和数组 40 | int[] preSum = new int[n + 1]; 41 | preSum[0] = 0; 42 | for (int i = 0; i < n; i++) 43 | preSum[i + 1] = preSum[i] + nums[i]; 44 | ``` 45 | 46 | ![](../pictures/%E5%89%8D%E7%BC%80%E5%92%8C/1.jpg) 47 | 48 | 这个前缀和数组 `preSum` 的含义也很好理解,`preSum[i]` 就是 `nums[0..i-1]` 的和。那么如果我们想求 `nums[i..j]` 的和,只需要一步操作 `preSum[j+1]-preSum[i]` 即可,而不需要重新去遍历数组了。 49 | 50 | 回到这个子数组问题,我们想求有多少个子数组的和为 k,借助前缀和技巧很容易写出一个解法: 51 | 52 | ```java 53 | int subarraySum(int[] nums, int k) { 54 | int n = nums.length; 55 | // 构造前缀和 56 | int[] sum = new int[n + 1]; 57 | sum[0] = 0; 58 | for (int i = 0; i < n; i++) 59 | sum[i + 1] = sum[i] + nums[i]; 60 | 61 | int ans = 0; 62 | // 穷举所有子数组 63 | for (int i = 1; i <= n; i++) 64 | for (int j = 0; j < i; j++) 65 | // sum of nums[j..i-1] 66 | if (sum[i] - sum[j] == k) 67 | ans++; 68 | 69 | return ans; 70 | } 71 | ``` 72 | 73 | 这个解法的时间复杂度 `O(N^2)` 空间复杂度 `O(N)`,并不是最优的解法。不过通过这个解法理解了前缀和数组的工作原理之后,可以使用一些巧妙的办法把时间复杂度进一步降低。 74 | 75 | ### 二、优化解法 76 | 77 | 前面的解法有嵌套的 for 循环: 78 | 79 | ```java 80 | for (int i = 1; i <= n; i++) 81 | for (int j = 0; j < i; j++) 82 | if (sum[i] - sum[j] == k) 83 | ans++; 84 | ``` 85 | 86 | 第二层 for 循环在干嘛呢?翻译一下就是,**在计算,有几个 `j` 能够使得 `sum[i]` 和 `sum[j]` 的差为 k。**毎找到一个这样的 `j`,就把结果加一。 87 | 88 | 我们可以把 if 语句里的条件判断移项,这样写: 89 | 90 | ```java 91 | if (sum[j] == sum[i] - k) 92 | ans++; 93 | ``` 94 | 95 | 优化的思路是:**我直接记录下有几个 `sum[j]` 和 `sum[i] - k` 相等,直接更新结果,就避免了内层的 for 循环**。我们可以用哈希表,在记录前缀和的同时记录该前缀和出现的次数。 96 | 97 | ```java 98 | int subarraySum(int[] nums, int k) { 99 | int n = nums.length; 100 | // map:前缀和 -> 该前缀和出现的次数 101 | HashMap 102 | preSum = new HashMap<>(); 103 | // base case 104 | preSum.put(0, 1); 105 | 106 | int ans = 0, sum0_i = 0; 107 | for (int i = 0; i < n; i++) { 108 | sum0_i += nums[i]; 109 | // 这是我们想找的前缀和 nums[0..j] 110 | int sum0_j = sum0_i - k; 111 | // 如果前面有这个前缀和,则直接更新答案 112 | if (preSum.containsKey(sum0_j)) 113 | ans += preSum.get(sum0_j); 114 | // 把前缀和 nums[0..i] 加入并记录出现次数 115 | preSum.put(sum0_i, 116 | preSum.getOrDefault(sum0_i, 0) + 1); 117 | } 118 | return ans; 119 | } 120 | ``` 121 | 122 | 比如说下面这个情况,需要前缀和 8 就能找到和为 k 的子数组了,之前的暴力解法需要遍历数组去数有几个 8,而优化解法借助哈希表可以直接得知有几个前缀和为 8。 123 | 124 | ![](../pictures/%E5%89%8D%E7%BC%80%E5%92%8C/2.jpg) 125 | 126 | 这样,就把时间复杂度降到了 `O(N)`,是最优解法了。 127 | 128 | ### 三、总结 129 | 130 | 前缀和不难,却很有用,主要用于处理数组区间的问题。 131 | 132 | 比如说,让你统计班上同学考试成绩在不同分数段的百分比,也可以利用前缀和技巧: 133 | 134 | ```java 135 | int[] scores; // 存储着所有同学的分数 136 | // 试卷满分 150 分 137 | int[] count = new int[150 + 1] 138 | // 记录每个分数有几个同学 139 | for (int score : scores) 140 | count[score]++ 141 | // 构造前缀和 142 | for (int i = 1; i < count.length; i++) 143 | count[i] = count[i] + count[i-1]; 144 | ``` 145 | 146 | 这样,给你任何一个分数段,你都能通过前缀和相减快速计算出这个分数段的人数,百分比也就很容易计算了。 147 | 148 | 但是,稍微复杂一些的算法问题,不止考察简单的前缀和技巧。比如本文探讨的这道题目,就需要借助前缀和的思路做进一步的优化,借助哈希表去除不必要的嵌套循环。可见对题目的理解和细节的分析能力对于算法的优化是至关重要的。 149 | 150 | 希望本文对你有帮助。 151 | 152 | **_____________** 153 | 154 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 155 | 156 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 157 | 158 |

159 | 160 |

161 | 162 | ======其他语言代码====== 163 | 164 | [560.和为K的子数组](https://leetcode-cn.com/problems/subarray-sum-equals-k) 165 | 166 | 167 | 168 | ### javascript 169 | 170 | [560.和为K的子数组](https://leetcode-cn.com/problems/subarray-sum-equals-k) 171 | 172 | ```js 173 | /** 174 | * @param {number[]} nums 175 | * @param {number} k 176 | * @return {number} 177 | */ 178 | let subarraySum = function (nums, k) { 179 | let n = nums.length; 180 | // 构造前缀和 181 | let sum = new Array(n + 1); 182 | sum[0] = 0; 183 | 184 | for (let i = 0; i < n; i++) { 185 | sum[i + 1] = sum[i] + nums[i]; 186 | } 187 | 188 | 189 | let ans = 0; 190 | // 穷举所有子数组 191 | for (let i = 1; i <= n; i++) 192 | for (let j = 0; j < i; j++) 193 | // sum of nums[j..i-1] 194 | if (sum[i] - sum[j] === k) 195 | ans++; 196 | 197 | return ans; 198 | } 199 | ``` 200 | 201 | 优化一下。 202 | 203 | ```js 204 | /** 205 | * @param {number[]} nums 206 | * @param {number} k 207 | * @return {number} 208 | */ 209 | let subarraySum = function (nums, k) { 210 | let n = nums.length; 211 | // map:前缀和 -> 该前缀和出现的次数 212 | let preSum = new Map(); 213 | 214 | // base case 215 | preSum.set(0, 1); 216 | 217 | let ans = 0, sum0_i = 0; 218 | for (let i = 0; i < n; i++) { 219 | sum0_i += nums[i]; 220 | // 这是我们想找的前缀和 nums[0..j] 221 | let sum0_j = sum0_i - k; 222 | // 如果前面有这个前缀和,则直接更新答案 223 | if (preSum.has(sum0_j)) 224 | ans += preSum.get(sum0_j); 225 | 226 | // 把前缀和 nums[0..i] 加入并记录出现次数 227 | if (preSum.has(sum0_i)) { 228 | preSum.set(sum0_i, 229 | preSum.get(sum0_i) + 1); 230 | } else { 231 | preSum.set(sum0_i, 1); 232 | } 233 | 234 | } 235 | return ans; 236 | } 237 | ``` 238 | 239 | -------------------------------------------------------------------------------- /算法思维系列/区间交集问题.md: -------------------------------------------------------------------------------- 1 | # 区间交集问题 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [经典动态规划:编辑距离](https://labuladong.gitee.io/algo/) 15 | * [经典动态规划:高楼扔鸡蛋(进阶)](https://labuladong.gitee.io/algo/) 16 | 17 | 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 18 | 19 | [986.区间列表的交集](https://leetcode-cn.com/problems/interval-list-intersections) 20 | 21 | **-----------** 22 | 23 | 本文是区间系列问题的第三篇,前两篇分别讲了区间的最大不相交子集和重叠区间的合并,今天再写一个算法,可以快速找出两组区间的交集。 24 | 25 | 先看下题目,LeetCode 第 986 题就是这个问题: 26 | 27 | ![title](../pictures/intersection/title.png) 28 | 29 | 题目很好理解,就是让你找交集,注意区间都是闭区间。 30 | 31 | ### 思路 32 | 33 | 解决区间问题的思路一般是先排序,以便操作,不过题目说已经排好序了,那么可以用两个索引指针在 `A` 和 `B` 中游走,把交集找出来,代码大概是这样的: 34 | 35 | ```python 36 | # A, B 形如 [[0,2],[5,10]...] 37 | def intervalIntersection(A, B): 38 | i, j = 0, 0 39 | res = [] 40 | while i < len(A) and j < len(B): 41 | # ... 42 | j += 1 43 | i += 1 44 | return res 45 | ``` 46 | 47 | 不难,我们先老老实实分析一下各种情况。 48 | 49 | 首先,**对于两个区间**,我们用 `[a1,a2]` 和 `[b1,b2]` 表示在 `A` 和 `B` 中的两个区间,那么什么情况下这两个区间**没有交集**呢: 50 | 51 | ![](../pictures/intersection/1.jpg) 52 | 53 | 只有这两种情况,写成代码的条件判断就是这样: 54 | 55 | ```python 56 | if b2 < a1 or a2 < b1: 57 | [a1,a2] 和 [b1,b2] 无交集 58 | ``` 59 | 60 | 那么,什么情况下,两个区间存在交集呢?根据命题的否定,上面逻辑的否命题就是存在交集的条件: 61 | 62 | ```python 63 | # 不等号取反,or 也要变成 and 64 | if b2 >= a1 and a2 >= b1: 65 | [a1,a2] 和 [b1,b2] 存在交集 66 | ``` 67 | 68 | 接下来,两个区间存在交集的情况有哪些呢?穷举出来: 69 | 70 | ![](../pictures/intersection/2.jpg) 71 | 72 | 这很简单吧,就这四种情况而已。那么接下来思考,这几种情况下,交集是否有什么共同点呢? 73 | 74 | ![](../pictures/intersection/3.jpg) 75 | 76 | 我们惊奇地发现,交集区间是有规律的!如果交集区间是 `[c1,c2]`,那么 `c1=max(a1,b1)`,`c2=min(a2,b2)`!这一点就是寻找交集的核心,我们把代码更进一步: 77 | 78 | ```python 79 | while i < len(A) and j < len(B): 80 | a1, a2 = A[i][0], A[i][1] 81 | b1, b2 = B[j][0], B[j][1] 82 | if b2 >= a1 and a2 >= b1: 83 | res.append([max(a1, b1), min(a2, b2)]) 84 | # ... 85 | ``` 86 | 87 | 最后一步,我们的指针 `i` 和 `j` 肯定要前进(递增)的,什么时候应该前进呢? 88 | 89 | ![](../pictures/intersection/4.gif) 90 | 91 | 结合动画示例就很好理解了,是否前进,只取决于 `a2` 和 `b2` 的大小关系: 92 | 93 | ```python 94 | while i < len(A) and j < len(B): 95 | # ... 96 | if b2 < a2: 97 | j += 1 98 | else: 99 | i += 1 100 | ``` 101 | 102 | ### 代码 103 | 104 | ```python 105 | # A, B 形如 [[0,2],[5,10]...] 106 | def intervalIntersection(A, B): 107 | i, j = 0, 0 # 双指针 108 | res = [] 109 | while i < len(A) and j < len(B): 110 | a1, a2 = A[i][0], A[i][1] 111 | b1, b2 = B[j][0], B[j][1] 112 | # 两个区间存在交集 113 | if b2 >= a1 and a2 >= b1: 114 | # 计算出交集,加入 res 115 | res.append([max(a1, b1), min(a2, b2)]) 116 | # 指针前进 117 | if b2 < a2: j += 1 118 | else: i += 1 119 | return res 120 | ``` 121 | 122 | 总结一下,区间类问题看起来都比较复杂,情况很多难以处理,但实际上通过观察各种不同情况之间的共性可以发现规律,用简洁的代码就能处理。 123 | 124 | 另外,区间问题没啥特别厉害的奇技淫巧,其操作也朴实无华,但其应用却十分广泛。 125 | 126 | **_____________** 127 | 128 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 129 | 130 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 131 | 132 |

133 | 134 |

135 | ======其他语言代码====== 136 | 137 | [986.区间列表的交集](https://leetcode-cn.com/problems/interval-list-intersections) 138 | 139 | 140 | 141 | ### java 142 | 143 | [KiraZh](https://github.com/KiraZh)提供第986题Java代码 144 | 145 | ```java 146 | class Solution { 147 | public int[][] intervalIntersection(int[][] A, int[][] B) { 148 | List res = new ArrayList<>(); 149 | int a = 0, b = 0; 150 | while(a < A.length && b < B.length) { 151 | // 确定左边界,两个区间左边界的最大值 152 | int left = Math.max(A[a][0], B[b][0]); 153 | // 确定右边界,两个区间右边界的最小值 154 | int right = Math.min(A[a][1], B[b][1]); 155 | // 左边界小于右边界则加入结果集 156 | if (left <= right) 157 | res.add(new int[] {left, right}); 158 | // 右边界更大的保持不动,另一个指针移动,继续比较 159 | if(A[a][1] < B[b][1]) a++; 160 | else b++; 161 | } 162 | // 将结果转为数组 163 | return res.toArray(new int[0][]); 164 | } 165 | } 166 | ``` 167 | 168 | 169 | 170 | ### javascript 171 | 172 | [986.区间列表的交集](https://leetcode-cn.com/problems/interval-list-intersections) 173 | 174 | ```js 175 | /** 176 | * @param {number[][]} firstList 177 | * @param {number[][]} secondList 178 | * @return {number[][]} 179 | */ 180 | var intervalIntersection = function (firstList, secondList) { 181 | let i, j; 182 | i = j = 0; 183 | 184 | let res = []; 185 | 186 | while (i < firstList.length && j < secondList.length) { 187 | let a1 = firstList[i][0]; 188 | let a2 = firstList[i][1]; 189 | let b1 = secondList[j][0]; 190 | let b2 = secondList[j][1]; 191 | 192 | // 两个区间存在交集 193 | if (b2 >= a1 && a2 >= b1) { 194 | // 计算出交集,加入 res 195 | res.push([Math.max(a1, b1), Math.min(a2, b2)]) 196 | } 197 | 198 | // 指针前进 199 | if (b2 < a2) { 200 | j += 1; 201 | } else { 202 | i += 1 203 | } 204 | } 205 | return res; 206 | }; 207 | ``` 208 | 209 | -------------------------------------------------------------------------------- /算法思维系列/常用的位操作.md: -------------------------------------------------------------------------------- 1 | # 常用的位操作 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [40张图解:TCP三次握手和四次挥手面试题](https://labuladong.gitee.io/algo/) 15 | * [动态规划答疑篇](https://labuladong.gitee.io/algo/) 16 | 17 | 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 18 | 19 | [191.位1的个数](https://leetcode-cn.com/problems/number-of-1-bits) 20 | 21 | [231.2的幂](https://leetcode-cn.com/problems/power-of-two/) 22 | 23 | **-----------** 24 | 25 | 本文分两部分,第一部分列举几个有趣的位操作,第二部分讲解算法中常用的 `n & (n - 1)` 操作,顺便把用到这个技巧的算法题列出来讲解一下。因为位操作很简单,所以假设读者已经了解与、或、异或这三种基本操作。 26 | 27 | 位操作(Bit Manipulation)可以玩出很多奇技淫巧,但是这些技巧大部分都过于晦涩,没必要深究,读者只要记住一些有用的操作即可。 28 | 29 | ### 一、几个有趣的位操作 30 | 31 | 1. **利用或操作 `|` 和空格将英文字符转换为小写** 32 | 33 | ```c 34 | ('a' | ' ') = 'a' 35 | ('A' | ' ') = 'a' 36 | ``` 37 | 38 | 2. **利用与操作 `&` 和下划线将英文字符转换为大写** 39 | 40 | ```c 41 | ('b' & '_') = 'B' 42 | ('B' & '_') = 'B' 43 | ``` 44 | 45 | 3. **利用异或操作 `^` 和空格进行英文字符大小写互换** 46 | 47 | ```c 48 | ('d' ^ ' ') = 'D' 49 | ('D' ^ ' ') = 'd' 50 | ``` 51 | 52 | 以上操作能够产生奇特效果的原因在于 ASCII 编码。字符其实就是数字,恰巧这些字符对应的数字通过位运算就能得到正确的结果,有兴趣的读者可以查 ASCII 码表自己算算,本文就不展开讲了。 53 | 54 | 4. **判断两个数是否异号** 55 | 56 | ```cpp 57 | int x = -1, y = 2; 58 | bool f = ((x ^ y) < 0); // true 59 | 60 | int x = 3, y = 2; 61 | bool f = ((x ^ y) < 0); // false 62 | ``` 63 | 64 | 这个技巧还是很实用的,利用的是补码编码的符号位。如果不用位运算来判断是否异号,需要使用 if else 分支,还挺麻烦的。读者可能想利用乘积或者商来判断两个数是否异号,但是这种处理方式可能造成溢出,从而出现错误。 65 | 66 | 5. **不用临时变量交换两个数** 67 | 68 | ```c 69 | int a = 1, b = 2; 70 | a ^= b; 71 | b ^= a; 72 | a ^= b; 73 | // 现在 a = 2, b = 1 74 | ``` 75 | 76 | 6. **加一** 77 | 78 | ```c 79 | int n = 1; 80 | n = -~n; 81 | // 现在 n = 2 82 | ``` 83 | 84 | 7. **减一** 85 | 86 | ```c 87 | int n = 2; 88 | n = ~-n; 89 | // 现在 n = 1 90 | ``` 91 | 92 | PS:上面这三个操作就纯属装逼用的,没啥实际用处,大家了解了解乐呵一下就行。 93 | 94 | ### 二、算法常用操作 95 | 96 | `n&(n-1)` 这个操作是算法中常见的,作用是消除数字 `n` 的二进制表示中的最后一个 1。 97 | 98 | 看个图就很容易理解了: 99 | 100 | ![](../pictures/%E4%BD%8D%E6%93%8D%E4%BD%9C/1.png) 101 | 102 | 其核心逻辑就是,`n - 1` 一定可以消除最后一个 1,同时把其后的 0 都变成 1,这样再和 `n` 做一次 `&` 运算,就可以仅仅把最后一个 1 变成 0 了。 103 | 104 | 1. **计算汉明权重(Hamming Weight)** 105 | 106 | ![](../pictures/%E4%BD%8D%E6%93%8D%E4%BD%9C/title.png) 107 | 108 | 就是让你返回 n 的二进制表示中有几个 1。因为 n & (n - 1) 可以消除最后一个 1,所以可以用一个循环不停地消除 1 同时计数,直到 n 变成 0 为止。 109 | 110 | ```cpp 111 | int hammingWeight(uint32_t n) { 112 | int res = 0; 113 | while (n != 0) { 114 | n = n & (n - 1); 115 | res++; 116 | } 117 | return res; 118 | } 119 | ``` 120 | 121 | 2. **判断一个数是不是 2 的指数** 122 | 123 | 一个数如果是 2 的指数,那么它的二进制表示一定只含有一个 1: 124 | 125 | ```cpp 126 | 2^0 = 1 = 0b0001 127 | 2^1 = 2 = 0b0010 128 | 2^2 = 4 = 0b0100 129 | ``` 130 | 131 | 如果使用 `n&(n-1)` 的技巧就很简单了(注意运算符优先级,括号不可以省略): 132 | 133 | ```cpp 134 | bool isPowerOfTwo(int n) { 135 | if (n <= 0) return false; 136 | return (n & (n - 1)) == 0; 137 | } 138 | ``` 139 | 140 | **3、查找只出现一次的元素** 141 | 142 | ![](../pictures/位操作/title1.png) 143 | 144 | 这里就可以运用异或运算的性质: 145 | 146 | 一个数和它本身做异或运算结果为 0,即 `a ^ a = 0`;一个数和 0 做异或运算的结果为它本身,即 `a ^ 0 = a`。 147 | 148 | 对于这道题目,我们只要把所有数字进行异或,成对儿的数字就会变成 0,落单的数字和 0 做异或还是它本身,所以最后异或的结果就是只出现一次的元素: 149 | 150 | ```cpp 151 | int singleNumber(vector& nums) { 152 | int res = 0; 153 | for (int n : nums) { 154 | res ^= n; 155 | } 156 | return res; 157 | } 158 | ``` 159 | 160 | 161 | 以上便是一些有趣/常用的位操作。其实位操作的技巧很多,有一个叫做 Bit Twiddling Hacks 的外国网站收集了几乎所有位操作的黑科技玩法,感兴趣的读者可以查看: 162 | 163 | http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel 164 | 165 | **_____________** 166 | 167 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 168 | 169 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 170 | 171 |

172 | 173 |

174 | ======其他语言代码====== 175 | 176 | [191.位1的个数](https://leetcode-cn.com/problems/number-of-1-bits) 177 | 178 | [231.2的幂](https://leetcode-cn.com/problems/power-of-two/) 179 | 180 | 181 | 182 | ### python 183 | 184 | 由[JodyZ0203](https://github.com/JodyZ0203)提供 191. 位1的个数 Python3 解法代码: 185 | 186 | ```Python 187 | class Solution: 188 | def hammingWeight(self, n: int) -> int: 189 | 190 | # 先定义一个count,用来存1的出现数量 191 | count = 0 192 | 193 | # 只要二进制串不等于0之前,我们用一个循环边消除1和计1的出现数量 194 | while n!=0: 195 | 196 | # 用labuladong在文章中所提到的 n&(n-1) 技巧来消除最后一个1 197 | n = n & (n-1) 198 | 199 | count+=1 200 | 201 | # 当二进制串全消除完之后,返回1出现的总数量 202 | return count 203 | ``` 204 | 205 | 206 | 207 | ### javascript 208 | 209 | [191.位1的个数](https://leetcode-cn.com/problems/number-of-1-bits) 210 | 211 | ```js 212 | let hammingWeight = function(n) { 213 | let res = 0; 214 | while (n !== 0) { 215 | n = n & (n - 1); 216 | res++; 217 | } 218 | return res; 219 | } 220 | ``` 221 | 222 | [231.2的幂](https://leetcode-cn.com/problems/power-of-two/) 223 | 224 | ```js 225 | /** 226 | * @param {number} n 227 | * @return {boolean} 228 | */ 229 | let isPowerOfTwo = function(n) { 230 | if (n <= 0) return false; 231 | return (n & (n - 1)) === 0; 232 | } 233 | ``` 234 | 235 | [136. 只出现一次的数字](https://leetcode-cn.com/problems/single-number/) 236 | 237 | 查找只出现一次的元素 238 | 239 | ```js 240 | /** 241 | * @param {number[]} nums 242 | * @return {number} 243 | */ 244 | let singleNumber = function(nums) { 245 | let res = 0; 246 | for (let n of nums) { 247 | res ^= n; 248 | } 249 | return res; 250 | } 251 | ``` 252 | 253 | -------------------------------------------------------------------------------- /算法思维系列/算法学习之路.md: -------------------------------------------------------------------------------- 1 | # 算法学习之路 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [Git/SQL/正则表达式的在线练习平台](https://labuladong.gitee.io/algo/) 15 | * [回溯算法团灭子集、排列、组合问题](https://labuladong.gitee.io/algo/) 16 | 17 | **-----------** 18 | 19 | 之前发的那篇关于框架性思维的文章,我也发到了不少其他圈子,受到了大家的普遍好评,这一点我真的没想到,首先感谢大家的认可,我会更加努力,写出通俗易懂的算法文章。 20 | 21 | 有很多朋友问我数据结构和算法到底该怎么学,尤其是很多朋友说自己是「小白」,感觉这些东西好难啊,就算看了之前的「框架思维」,也感觉自己刷题乏力,希望我能聊聊我从一个非科班小白一路是怎么学过来的。 22 | 23 | 首先要给怀有这样疑问的朋友鼓掌,因为你现在已经「知道自己不知道」,而且开始尝试学习、刷题、寻求帮助,能做到这一点本身就是及其困难的。 24 | 25 | 关于「框架性思维」,对于一个小白来说,可能暂时无法完全理解(如果你能理解,说明你水平已经不错啦,不是小白啦)。就像软件工程,对于我这种没带过项目的人来说,感觉其内容枯燥乏味,全是废话,但是对于一个带过团队的人,他就会觉得软件工程里的每一句话都是精华。暂时不太理解没关系,留个印象,功夫到了很快就明白了。 26 | 27 | 下面写一写我一路过来的一些经验。如果你已经看过很多「如何高效刷题」「如何学习算法」的文章,却还是没有开始行动并坚持下去,本文的第五点就是写给你的。 28 | 29 | 我觉得之所以有时候认为自己是「小白」,是由于知识某些方面的空白造成的。具体到数据结构的学习,无非就是两个问题搞得不太清楚:**这是啥?有啥用?** 30 | 31 | 举个例子,比如说你看到了「栈」这个名词,老师可能会讲这些关键词:先进后出、函数堆栈等等。但是,对于初学者,这些描述属于文学词汇,没有实际价值,没有解决最基本的两个问题。如何回答这两个基本问题呢?回答「这是啥」需要看教科书,回答「有啥用」需要刷算法题。 32 | 33 | **一、这是啥?** 34 | 35 | 这个问题最容易解决,就像一层窗户纸,你只要随便找本书看两天,自己动手实现一个「队列」「栈」之类的数据结构,就能捅破这层窗户纸。 36 | 37 | 这时候你就能理解「框架思维」文章中的前半部分了:数据结构无非就是数组、链表为骨架的一些特定操作而已;每个数据结构实现的功能无非增删查改罢了。 38 | 39 | 比如说「列队」这个数据结构,无非就是基于数组或者链表,实现 enqueue 和 dequeue 两个方法。这两个方法就是增和删呀,连查和改的方法都不需要。 40 | 41 | **二、有啥用?** 42 | 43 | 解决这个问题,就涉及算法的设计了,是个持久战,需要经常进行抽象思考,刷算法题,培养「计算机思维」。 44 | 45 | 之前的文章讲了,算法就是对数据结构准确而巧妙的运用。常用算法问题也就那几大类,算法题无非就是不断变换场景,给那几个算法框架套上不同的皮。刷题,就是在锻炼你的眼力,看你能不能看穿问题表象揪出相应的解法框架。 46 | 47 | 比如说,让你求解一个迷宫,你要把这个问题层层抽象:迷宫 -> 图的遍历 -> N 叉树的遍历 -> 二叉树的遍历。然后让框架指导你写具体的解法。 48 | 49 | 抽象问题,直击本质,是刷题中你需要刻意培养的能力。 50 | 51 | **三、如何看书** 52 | 53 | 直接推荐一本公认的好书,《算法第 4 版》,我一般简写成《算法4》。不要蜻蜓点水,这本书你能选择性的看上 50%,基本上就达到平均水平了。别怕这本书厚,因为起码有三分之一不用看,下面讲讲怎么看这本书。 54 | 55 | 看书仍然遵循递归的思想:自顶向下,逐步求精。 56 | 57 | 这本书知识结构合理,讲解也清楚,所以可以按顺序学习。**书中正文的算法代码一定要亲自敲一遍**,因为这些真的是扎实的基础,要认真理解。不要以为自己看一遍就看懂了,不动手的话理解不了的。但是,开头部分的基础可以酌情跳过;书中的数学证明,如不影响对算法本身的理解,完全可以跳过;章节最后的练习题,也可以全部跳过。这样一来,这本书就薄了很多。 58 | 59 | 相信读者现在已经认可了「框架性思维」的重要性,这种看书方式也是一种框架性策略,抓大放小,着重理解整体的知识架构,而忽略证明、练习题这种细节问题,即**保持自己对新知识的好奇心,避免陷入无限的细节被劝退。** 60 | 61 | 当然,《算法4》到后面的内容也比较难了,比如那几个著名的串算法,以及正则表达式算法。这些属于「经典算法」,看个人接受能力吧,单说刷 LeetCode 的话,基本用不上,量力而行即可。 62 | 63 | **四、如何刷题** 64 | 65 | 首先声明一下,**算法和数学水平没关系,和编程语言也没关系**,你爱用什么语言用什么。算法,主要是培养一种新的思维方式。所谓「计算机思维」,就跟你考驾照一样,你以前骑自行车,有一套自行车的规则和技巧,现在你开汽车,就需要适应并练习开汽车的规则和技巧。 66 | 67 | LeetCode 上的算法题和前面说的「经典算法」不一样,我们权且称为「解闷算法」吧,因为很多题目都比较有趣,有种在做奥数题或者脑筋急转弯的感觉。比如说,让你用队列实现一个栈,或者用栈实现一个队列,以及不用加号做加法,开脑洞吧? 68 | 69 | 当然,这些问题虽然看起来无厘头,实际生活中也用不到,但是想解决这些问题依然要靠数据结构以及对基础知识的理解,也许这就是很多公司面试都喜欢出这种「智力题」的原因。下面说几点技巧吧。 70 | 71 | **尽量刷英文版的 LeetCode**,中文版的“力扣”是阉割版,不仅很多题目没有答案,而且连个讨论区都没有。英文版的是真的很良心了,很多问题都有官方解答,详细易懂。而且讨论区(Discuss)也沉淀了大量优质内容,甚至好过官方解答。真正能打开你思路的,很可能是讨论区各路大神的思路荟萃。 72 | 73 | PS:**如果有的英文题目实在看不懂,有个小技巧**,你在题目页面的 url 里加一个 -cn,即 https://leetcode.com/xxx 改成 https://leetcode-cn.com/xxx,这样就能切换到相应的中文版页面查看。 74 | 75 | 对于初学者,**强烈建议从 Explore 菜单里最下面的 Learn 开始刷**,这个专题就是专门教你学习数据结构和基本算法的,教学篇和相应的练习题结合,不要太良心。 76 | 77 | 最近 Learn 专题里新增了一些内容,我们挑数据结构相关的内容刷就行了,像 Ruby,Machine Learning 就没必要刷了。刷完 Learn 专题的基础内容,基本就有能力去 Explore 菜单的 Interview 专题刷面试题,或者去 Problem 菜单,在真正的题海里遨游了。 78 | 79 | 无论刷 Explore 还是 Problems 菜单,**最好一个分类一个分类的刷,不要蜻蜓点水**。比如说这几天就刷链表,刷完链表再去连刷几天二叉树。这样做是为了帮助你提取「框架」。一旦总结出针对一类问题的框架,解决同类问题可谓是手到擒来。 80 | 81 | **五、道理我都懂,还是不能坚持下去** 82 | 83 | 这其实无关算法了,还是老生常谈的执行力的问题。不说什么破鸡汤了,我觉得**解决办法就是「激起欲望」**,注意我说的是欲望,而不是常说的兴趣,拿我自己说说吧。 84 | 85 | 半年前我开始刷题,目的和大部分人都一样的,就是为毕业找工作做准备。只不过,大部分人是等到临近毕业了才开始刷,而我离毕业还有一阵子。这不是炫耀我多有觉悟,而是我承认自己的极度平凡。 86 | 87 | 首先,我真的想找到一份不错的工作(谁都想吧?),我想要高薪呀!否则我在朋友面前,女神面前放下的骚话,最终都会反过来啪啪地打我的脸。我也是要恰饭,要面子,要虚荣心的嘛。赚钱,虚荣心,足以激起我的欲望了。 88 | 89 | 但是,我不擅长 deadline 突击,我理解东西真的慢,所以干脆笨鸟先飞了。智商不够,拿时间来补,我没能力两个月突击,干脆拉长战线,打他个两年游击战,我还不信耗不死算法这个强敌。事实证明,你如果认真学习一个月,就能够取得肉眼可见的进步了。 90 | 91 | 现在,我依然在坚持刷题,而且为了另外一个原因,这个公众号。我没想到自己的文字竟然能够帮助到他人,甚至能得到认可。这也是虚荣心啊,我不能让读者失望啊,我想让更多的人认可(夸)我呀! 92 | 93 | 以上,不光是坚持刷算法题吧,很多场景都适用。执行力是要靠「欲望」支撑的,我也是一凡人,只有那些看得见摸得着的东西才能使我快乐呀。读者不妨也尝试把刷题学习和自己的切身利益联系起来,这恐怕是坚持下去最简单直白的理由了。 94 | 95 | 96 | 97 | **_____________** 98 | 99 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 100 | 101 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 102 | 103 |

104 | 105 |

106 | 107 | ======其他语言代码====== -------------------------------------------------------------------------------- /高频面试系列/README.md: -------------------------------------------------------------------------------- 1 | # 高频面试系列 2 | 3 | 8 说了,本章都是高频面试题,配合前面的动态规划系列,祝各位马到成功! 4 | 5 | 欢迎关注我的公众号 labuladong,查看全部文章: 6 | 7 | ![labuladong二维码](../pictures/qrcode.jpg) -------------------------------------------------------------------------------- /高频面试系列/k个一组反转链表.md: -------------------------------------------------------------------------------- 1 | # 如何k个一组反转链表 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [区间调度之区间交集问题](https://labuladong.gitee.io/algo/) 15 | * [动态规划和回溯算法到底谁是谁爹?](https://labuladong.gitee.io/algo/) 16 | 17 | 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 18 | 19 | [25.K个一组翻转链表](https://leetcode-cn.com/problems/reverse-nodes-in-k-group) 20 | 21 | **-----------** 22 | 23 | 之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决。 24 | 25 | 本文要解决「K 个一组反转链表」,不难理解: 26 | 27 | ![](../pictures/kgroup/title.png) 28 | 29 | 这个问题经常在面经中看到,而且 LeetCode 上难度是 Hard,它真的有那么难吗? 30 | 31 | 对于基本数据结构的算法问题其实都不难,只要结合特点一点点拆解分析,一般都没啥难点。下面我们就来拆解一下这个问题。 32 | 33 | ### 一、分析问题 34 | 35 | 首先,前文[学习数据结构的框架思维](https://labuladong.gitee.io/algo/)提到过,链表是一种兼具递归和迭代性质的数据结构,认真思考一下可以发现**这个问题具有递归性质**。 36 | 37 | 什么叫递归性质?直接上图理解,比如说我们对这个链表调用 `reverseKGroup(head, 2)`,即以 2 个节点为一组反转链表: 38 | 39 | ![](../pictures/kgroup/1.jpg) 40 | 41 | 如果我设法把前 2 个节点反转,那么后面的那些节点怎么处理?后面的这些节点也是一条链表,而且规模(长度)比原来这条链表小,这就叫**子问题**。 42 | 43 | ![](../pictures/kgroup/2.jpg) 44 | 45 | 我们可以直接递归调用 `reverseKGroup(cur, 2)`,因为子问题和原问题的结构完全相同,这就是所谓的递归性质。 46 | 47 | 发现了递归性质,就可以得到大致的算法流程: 48 | 49 | **1、先反转以 `head` 开头的 `k` 个元素**。 50 | 51 | ![](../pictures/kgroup/3.jpg) 52 | 53 | **2、将第 `k + 1` 个元素作为 `head` 递归调用 `reverseKGroup` 函数**。 54 | 55 | ![](../pictures/kgroup/4.jpg) 56 | 57 | **3、将上述两个过程的结果连接起来**。 58 | 59 | ![](../pictures/kgroup/5.jpg) 60 | 61 | 整体思路就是这样了,最后一点值得注意的是,递归函数都有个 base case,对于这个问题是什么呢? 62 | 63 | 题目说了,如果最后的元素不足 `k` 个,就保持不变。这就是 base case,待会会在代码里体现。 64 | 65 | ### 二、代码实现 66 | 67 | 首先,我们要实现一个 `reverse` 函数反转一个区间之内的元素。在此之前我们再简化一下,给定链表头结点,如何反转整个链表? 68 | 69 | ```java 70 | // 反转以 a 为头结点的链表 71 | ListNode reverse(ListNode a) { 72 | ListNode pre, cur, nxt; 73 | pre = null; cur = a; nxt = a; 74 | while (cur != null) { 75 | nxt = cur.next; 76 | // 逐个结点反转 77 | cur.next = pre; 78 | // 更新指针位置 79 | pre = cur; 80 | cur = nxt; 81 | } 82 | // 返回反转后的头结点 83 | return pre; 84 | } 85 | ``` 86 | 87 | ![](../pictures/kgroup/8.gif) 88 | 89 | 这次使用迭代思路来实现的,借助动画理解应该很容易。 90 | 91 | 「反转以 `a` 为头结点的链表」其实就是「反转 `a` 到 null 之间的结点」,那么如果让你「反转 `a` 到 `b` 之间的结点」,你会不会? 92 | 93 | 只要更改函数签名,并把上面的代码中 `null` 改成 `b` 即可: 94 | 95 | ```java 96 | /** 反转区间 [a, b) 的元素,注意是左闭右开 */ 97 | ListNode reverse(ListNode a, ListNode b) { 98 | ListNode pre, cur, nxt; 99 | pre = null; cur = a; nxt = a; 100 | // while 终止的条件改一下就行了 101 | while (cur != b) { 102 | nxt = cur.next; 103 | cur.next = pre; 104 | pre = cur; 105 | cur = nxt; 106 | } 107 | // 返回反转后的头结点 108 | return pre; 109 | } 110 | ``` 111 | 112 | 现在我们迭代实现了反转部分链表的功能,接下来就按照之前的逻辑编写 `reverseKGroup` 函数即可: 113 | 114 | ```java 115 | ListNode reverseKGroup(ListNode head, int k) { 116 | if (head == null) return null; 117 | // 区间 [a, b) 包含 k 个待反转元素 118 | ListNode a, b; 119 | a = b = head; 120 | for (int i = 0; i < k; i++) { 121 | // 不足 k 个,不需要反转,base case 122 | if (b == null) return head; 123 | b = b.next; 124 | } 125 | // 反转前 k 个元素 126 | ListNode newHead = reverse(a, b); 127 | // 递归反转后续链表并连接起来 128 | a.next = reverseKGroup(b, k); 129 | return newHead; 130 | } 131 | ``` 132 | 133 | 解释一下 `for` 循环之后的几句代码,注意 `reverse` 函数是反转区间 `[a, b)`,所以情形是这样的: 134 | 135 | ![](../pictures/kgroup/6.jpg) 136 | 137 | 递归部分就不展开了,整个函数递归完成之后就是这个结果,完全符合题意: 138 | 139 | ![](../pictures/kgroup/7.jpg) 140 | 141 | ### 三、最后说两句 142 | 143 | 从阅读量上看,基本数据结构相关的算法文章看的人都不多,我想说这是要吃亏的。 144 | 145 | 大家喜欢看动态规划相关的问题,可能因为面试很常见,但就我个人理解,很多算法思想都是源于数据结构的。我们公众号的成名之作之一,「学习数据结构的框架思维」就提过,什么动规、回溯、分治算法,其实都是树的遍历,树这种结构它不就是个多叉链表吗?你能处理基本数据结构的问题,解决一般的算法问题应该也不会太费事。 146 | 147 | 那么如何分解问题、发现递归性质呢?这个只能多练习,也许后续可以专门写一篇文章来探讨一下,本文就到此为止吧,希望对大家有帮助! 148 | 149 | **_____________** 150 | 151 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 152 | 153 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 154 | 155 |

156 | 157 |

158 | 159 | ======其他语言代码====== 160 | 161 | [25.K个一组翻转链表](https://leetcode-cn.com/problems/reverse-nodes-in-k-group) 162 | 163 | ### javascript 164 | 165 | ```js 166 | /** 167 | * Definition for singly-linked list. 168 | * function ListNode(val, next) { 169 | * this.val = (val===undefined ? 0 : val) 170 | * this.next = (next===undefined ? null : next) 171 | * } 172 | */ 173 | 174 | 175 | // 示例一:反转以a为头结点的链表 176 | let reverse = function (a) { 177 | let pre, cur, nxt; 178 | pre = null; 179 | cur = a; 180 | nxt = a; 181 | while (cur != null) { 182 | nxt = cur.next; 183 | // 逐个结点反转 184 | cur.next = pre; 185 | // 更新指针位置 186 | pre = cur; 187 | cur = nxt; 188 | } 189 | // 返回反转后的头结点 190 | return pre; 191 | } 192 | 193 | /** 反转区间 [a, b) 的元素,注意是左闭右开 */ 194 | let reverse = (a, b) => { 195 | let pre, cur, nxt; 196 | pre = null; 197 | cur = a; 198 | nxt = a; 199 | // while 终止的条件改一下就行了 200 | while (cur !== b) { 201 | nxt = cur.next; 202 | cur.next = pre; 203 | pre = cur; 204 | cur = nxt; 205 | } 206 | // 返回反转后的头结点 207 | return pre; 208 | } 209 | 210 | 211 | /** 212 | * @param {ListNode} head 213 | * @param {number} k 214 | * @return {ListNode} 215 | */ 216 | let reverseKGroup = (head, k) => { 217 | if (head == null) return null; 218 | // 区间 [a, b) 包含 k 个待反转元素 219 | let a, b; 220 | a = b = head; 221 | for (let i = 0; i < k; i++) { 222 | // 不足k个,不需反转,base case 223 | if(b==null) return head; 224 | b = b.next; 225 | } 226 | 227 | // 反转前k个元素 228 | let newHead = reverse(a,b); 229 | 230 | // 递归反转后续链表并连接起来 231 | a.next = reverseKGroup(b,k); 232 | return newHead; 233 | } 234 | ``` 235 | 236 | -------------------------------------------------------------------------------- /高频面试系列/合法括号判定.md: -------------------------------------------------------------------------------- 1 | # 如何判定括号合法性 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [回溯算法解题套路框架](https://labuladong.gitee.io/algo/) 15 | * [Linux shell 的实用小技巧](https://labuladong.gitee.io/algo/) 16 | 17 | 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 18 | 19 | [20.有效的括号](https://leetcode-cn.com/problems/valid-parentheses) 20 | 21 | **-----------** 22 | 23 | 对括号的合法性判断是一个很常见且实用的问题,比如说我们写的代码,编辑器和编译器都会检查括号是否正确闭合。而且我们的代码可能会包含三种括号 `[](){}`,判断起来有一点难度。 24 | 25 | 本文就来聊一道关于括号合法性判断的算法题,相信能加深你对**栈**这种数据结构的理解。 26 | 27 | 题目很简单,输入一个字符串,其中包含 `[](){}` 六种括号,请你判断这个字符串组成的括号是否合法。 28 | 29 | ``` 30 | Input: "()[]{}" 31 | Output: true 32 | 33 | Input: "([)]" 34 | Output: false 35 | 36 | Input: "{[]}" 37 | Output: true 38 | ``` 39 | 40 | 解决这个问题之前,我们先降低难度,思考一下,**如果只有一种括号 `()`**,应该如何判断字符串组成的括号是否合法呢? 41 | 42 | ### 一、处理一种括号 43 | 44 | 字符串中只有圆括号,如果想让括号字符串合法,那么必须做到: 45 | 46 | **每个右括号 `)` 的左边必须有一个左括号 `(` 和它匹配**。 47 | 48 | 比如说字符串 `()))((` 中,中间的两个右括号**左边**就没有左括号匹配,所以这个括号组合是不合法的。 49 | 50 | 那么根据这个思路,我们可以写出算法: 51 | 52 | ```cpp 53 | bool isValid(string str) { 54 | // 待匹配的左括号数量 55 | int left = 0; 56 | for (char c : str) { 57 | if (c == '(') 58 | left++; 59 | else // 遇到右括号 60 | left--; 61 | 62 | if (left < 0) 63 | return false; 64 | } 65 | return left == 0; 66 | } 67 | ``` 68 | 69 | 如果只有圆括号,这样就能正确判断合法性。对于三种括号的情况,我一开始想模仿这个思路,定义三个变量 `left1`,`left2`,`left3` 分别处理每种括号,虽然要多写不少 if else 分支,但是似乎可以解决问题。 70 | 71 | 但实际上直接照搬这种思路是不行的,比如说只有一个括号的情况下 `(())` 是合法的,但是多种括号的情况下, `[(])` 显然是不合法的。 72 | 73 | 仅仅记录每种左括号出现的次数已经不能做出正确判断了,我们要加大存储的信息量,可以利用栈来模仿类似的思路。 74 | 75 | ### 二、处理多种括号 76 | 77 | 栈是一种先进后出的数据结构,处理括号问题的时候尤其有用。 78 | 79 | 我们这道题就用一个名为 `left` 的栈代替之前思路中的 `left` 变量,**遇到左括号就入栈,遇到右括号就去栈中寻找最近的左括号,看是否匹配**。 80 | 81 | ```cpp 82 | bool isValid(string str) { 83 | stack left; 84 | for (char c : str) { 85 | if (c == '(' || c == '{' || c == '[') 86 | left.push(c); 87 | else // 字符 c 是右括号 88 | if (!left.empty() && leftOf(c) == left.top()) 89 | left.pop(); 90 | else 91 | // 和最近的左括号不匹配 92 | return false; 93 | } 94 | // 是否所有的左括号都被匹配了 95 | return left.empty(); 96 | } 97 | 98 | char leftOf(char c) { 99 | if (c == '}') return '{'; 100 | if (c == ')') return '('; 101 | return '['; 102 | } 103 | ``` 104 | 105 | **_____________** 106 | 107 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 108 | 109 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 110 | 111 |

112 | 113 |

114 | ======其他语言代码====== 115 | 116 | [20.有效的括号](https://leetcode-cn.com/problems/valid-parentheses) 117 | 118 | ### python 119 | ```python 120 | def isValid(self, s: str) -> bool: 121 | left = [] 122 | leftOf = { 123 | ')':'(', 124 | ']':'[', 125 | '}':'{' 126 | } 127 | for c in s: 128 | if c in '([{': 129 | left.append(c) 130 | elif left and leftOf[c]==left[-1]: # 右括号 + left不为空 + 和最近左括号能匹配 131 | left.pop() 132 | else: # 右括号 + (left为空 / 和堆顶括号不匹配) 133 | return False 134 | 135 | # left中所有左括号都被匹配则return True 反之False 136 | return not left 137 | ``` 138 | 139 | 140 | 141 | ### java 142 | 143 | ```java 144 | //基本思想:每次遇到左括号时都将相对应的右括号')',']'或'}'推入堆栈 145 | //如果在字符串中出现右括号,则需要检查堆栈是否为空,以及顶部元素是否与该右括号相同。如果不是,则该字符串无效。 146 | //最后,我们还需要检查堆栈是否为空 147 | public boolean isValid(String s) { 148 | Deque stack = new ArrayDeque<>(); 149 | for(char c : s.toCharArray()){ 150 | //是左括号就将相对应的右括号入栈 151 | if(c=='(') { 152 | stack.offerLast(')'); 153 | }else if(c=='{'){ 154 | stack.offerLast('}'); 155 | }else if(c=='['){ 156 | stack.offerLast(']'); 157 | }else if(stack.isEmpty() || stack.pollLast()!=c){//出现右括号,检查堆栈是否为空,以及顶部元素是否与该右括号相同 158 | return false; 159 | } 160 | } 161 | return stack.isEmpty(); 162 | } 163 | 164 | 165 | ``` 166 | 167 | 168 | 169 | ### javascript 170 | 171 | ```js 172 | /** 173 | * @param {string} s是 174 | * @return {boolean} 175 | */ 176 | var isValid = function (s) { 177 | let left = [] 178 | for (let c of s) { 179 | if (c === '(' || c === '{' || c === '[') { 180 | left.push(c); 181 | } else { 182 | // 字符c是右括号 183 | //出现右括号,检查堆栈是否为空,以及顶部元素是否与该右括号相同 184 | if (left.length !== 0 && leftOf(c) === left[left.length - 1]) { 185 | left.pop(); 186 | } else { 187 | // 和最近的左括号不匹配 188 | return false; 189 | } 190 | } 191 | } 192 | return left.length === 0; 193 | }; 194 | 195 | 196 | let leftOf = function (c) { 197 | if (c === '}') return '{'; 198 | if (c === ')') return '('; 199 | return '['; 200 | } 201 | ``` 202 | 203 | 204 | 205 | -------------------------------------------------------------------------------- /高频面试系列/如何去除有序数组的重复元素.md: -------------------------------------------------------------------------------- 1 | # 如何去除有序数组的重复元素 2 | 3 | 我们知道对于数组来说,在尾部插入、删除元素是比较高效的,时间复杂度是 O(1),但是如果在中间或者开头插入、删除元素,就会涉及数据的搬移,时间复杂度为 O(N),效率较低。 4 | 5 | 所以对于一般处理数组的算法问题,我们要尽可能只对数组尾部的元素进行操作,以避免额外的时间复杂度。 6 | 7 | 这篇文章讲讲如何对一个有序数组去重,先看下题目: 8 | 9 | ![](../pictures/%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E5%8E%BB%E9%87%8D/title.png) 10 | 11 | 显然,由于数组已经排序,所以重复的元素一定连在一起,找出它们并不难,但如果毎找到一个重复元素就立即删除它,就是在数组中间进行删除操作,整个时间复杂度是会达到 O(N^2)。而且题目要求我们原地修改,也就是说不能用辅助数组,空间复杂度得是 O(1)。 12 | 13 | 其实,**对于数组相关的算法问题,有一个通用的技巧:要尽量避免在中间删除元素,那我就先想办法把这个元素换到最后去**。这样的话,最终待删除的元素都拖在数组尾部,一个一个 pop 掉就行了,每次操作的时间复杂度也就降低到 O(1) 了。 14 | 15 | 按照这个思路呢,又可以衍生出解决类似需求的通用方式:双指针技巧。具体一点说,应该是快慢指针。 16 | 17 | 我们让慢指针 `slow` 走左后面,快指针 `fast` 走在前面探路,找到一个不重复的元素就告诉 `slow` 并让 `slow` 前进一步。这样当 `fast` 指针遍历完整个数组 `nums` 后,**`nums[0..slow]` 就是不重复元素,之后的所有元素都是重复元素**。 18 | 19 | ```java 20 | int removeDuplicates(int[] nums) { 21 | int n = nums.length; 22 | if (n == 0) return 0; 23 | int slow = 0, fast = 1; 24 | while (fast < n) { 25 | if (nums[fast] != nums[slow]) { 26 | slow++; 27 | // 维护 nums[0..slow] 无重复 28 | nums[slow] = nums[fast]; 29 | } 30 | fast++; 31 | } 32 | // 长度为索引 + 1 33 | return slow + 1; 34 | } 35 | ``` 36 | 37 | 看下算法执行的过程: 38 | 39 | ![](../pictures/%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E5%8E%BB%E9%87%8D/1.gif) 40 | 41 | 再简单扩展一下,如果给你一个有序链表,如何去重呢?其实和数组是一模一样的,唯一的区别是把数组赋值操作变成操作指针而已: 42 | 43 | ```java 44 | ListNode deleteDuplicates(ListNode head) { 45 | if (head == null) return null; 46 | ListNode slow = head, fast = head.next; 47 | while (fast != null) { 48 | if (fast.val != slow.val) { 49 | // nums[slow] = nums[fast]; 50 | slow.next = fast; 51 | // slow++; 52 | slow = slow.next; 53 | } 54 | // fast++ 55 | fast = fast.next; 56 | } 57 | // 断开与后面重复元素的连接 58 | slow.next = null; 59 | return head; 60 | } 61 | ``` 62 | 63 | ![](../pictures/%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E5%8E%BB%E9%87%8D/2.gif) 64 | 65 | 66 | **_____________** 67 | 68 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 69 | 70 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 71 | 72 |

73 | 74 |

75 | 76 | ======其他语言代码====== 77 | 78 | [26. 删除排序数组中的重复项](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/) 79 | 80 | [83. 删除排序链表中的重复元素](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/) 81 | 82 | ### python 83 | 84 | [eric wang](https://www.github.com/eric496) 提供有序数组 Python3 代码 85 | 86 | ```python 87 | def removeDuplicates(self, nums: List[int]) -> int: 88 | n = len(nums) 89 | 90 | if n == 0: 91 | return 0 92 | 93 | slow, fast = 0, 1 94 | 95 | while fast < n: 96 | if nums[fast] != nums[slow]: 97 | slow += 1 98 | nums[slow] = nums[fast] 99 | 100 | fast += 1 101 | 102 | return slow + 1 103 | ``` 104 | 105 | [eric wang](https://www.github.com/eric496) 提供有序链表 Python3 代码 106 | 107 | ```python 108 | def deleteDuplicates(self, head: ListNode) -> ListNode: 109 | if not head: 110 | return head 111 | 112 | slow, fast = head, head.next 113 | 114 | while fast: 115 | if fast.val != slow.val: 116 | slow.next = fast 117 | slow = slow.next 118 | 119 | fast = fast.next 120 | 121 | # 断开与后面重复元素的连接 122 | slow.next = None 123 | return head 124 | ``` 125 | 126 | 127 | 128 | ### javascript 129 | 130 | [26. 删除排序数组中的重复项](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/) 131 | 132 | ```js 133 | /** 134 | * @param {number[]} nums 135 | * @return {number} 136 | */ 137 | var removeDuplicates = function(nums) { 138 | let n = nums.length; 139 | if (n === 0) return 0; 140 | if (n === 1) return 1; 141 | let slow = 0, fast = 1; 142 | while (fast < n) { 143 | if (nums[fast] !== nums[slow]) { 144 | slow++; 145 | // 维护nums[0...slow]无重复 146 | nums[slow] = nums[fast]; 147 | } 148 | fast++; 149 | } 150 | 151 | // 长度为索引+1 152 | return slow + 1; 153 | }; 154 | ``` 155 | 156 | [83. 删除排序链表中的重复元素](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/) 157 | 158 | ```js 159 | /** 160 | * Definition for singly-linked list. 161 | * function ListNode(val, next) { 162 | * this.val = (val===undefined ? 0 : val) 163 | * this.next = (next===undefined ? null : next) 164 | * } 165 | */ 166 | /** 167 | * @param {ListNode} head 168 | * @return {ListNode} 169 | */ 170 | var deleteDuplicates = function (head) { 171 | if (head == null) return null; 172 | let slow = head, fast = head.next; 173 | while (fast != null) { 174 | if(fast.val !== slow.val){ 175 | // nums[slow] = nums[fast]; 176 | slow.next = fast; 177 | // slow++; 178 | slow = slow.next; 179 | } 180 | 181 | // fast++ 182 | fast = fast.next; 183 | } 184 | 185 | // 断开与后面重复元素的连接 186 | slow.next = null; 187 | return head; 188 | } 189 | ``` 190 | 191 | -------------------------------------------------------------------------------- /高频面试系列/打印素数.md: -------------------------------------------------------------------------------- 1 | # 如何高效寻找素数 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [算法就像搭乐高:带你手撸 LRU 算法](https://labuladong.gitee.io/algo/) 15 | * [区间调度之区间合并问题](https://labuladong.gitee.io/algo/) 16 | 17 | 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 18 | 19 | [204.计数质数](https://leetcode-cn.com/problems/count-primes) 20 | 21 | **-----------** 22 | 23 | 素数的定义看起来很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数。 24 | 25 | 不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。比如让你写这样一个函数: 26 | 27 | ```java 28 | // 返回区间 [2, n) 中有几个素数 29 | int countPrimes(int n) 30 | 31 | // 比如 countPrimes(10) 返回 4 32 | // 因为 2,3,5,7 是素数 33 | ``` 34 | 35 | 你会如何写这个函数?我想大家应该会这样写: 36 | 37 | ```java 38 | int countPrimes(int n) { 39 | int count = 0; 40 | for (int i = 2; i < n; i++) 41 | if (isPrim(i)) count++; 42 | return count; 43 | } 44 | 45 | // 判断整数 n 是否是素数 46 | boolean isPrime(int n) { 47 | for (int i = 2; i < n; i++) 48 | if (n % i == 0) 49 | // 有其他整除因子 50 | return false; 51 | return true; 52 | } 53 | ``` 54 | 55 | 这样写的话时间复杂度 O(n^2),问题很大。**首先你用 isPrime 函数来辅助的思路就不够高效;而且就算你要用 isPrime 函数,这样写算法也是存在计算冗余的**。 56 | 57 | 先来简单说下**如果你要判断一个数是不是素数,应该如何写算法**。只需稍微修改一下上面的 isPrim 代码中的 for 循环条件: 58 | 59 | ```java 60 | boolean isPrime(int n) { 61 | for (int i = 2; i * i <= n; i++) 62 | ... 63 | } 64 | ``` 65 | 66 | 换句话说,`i` 不需要遍历到 `n`,而只需要到 `sqrt(n)` 即可。为什么呢,我们举个例子,假设 `n = 12`。 67 | 68 | ```java 69 | 12 = 2 × 6 70 | 12 = 3 × 4 71 | 12 = sqrt(12) × sqrt(12) 72 | 12 = 4 × 3 73 | 12 = 6 × 2 74 | ``` 75 | 76 | 可以看到,后两个乘积就是前面两个反过来,反转临界点就在 `sqrt(n)`。 77 | 78 | 换句话说,如果在 `[2,sqrt(n)]` 这个区间之内没有发现可整除因子,就可以直接断定 `n` 是素数了,因为在区间 `[sqrt(n),n]` 也一定不会发现可整除因子。 79 | 80 | 现在,`isPrime` 函数的时间复杂度降为 O(sqrt(N)),**但是我们实现 `countPrimes` 函数其实并不需要这个函数**,以上只是希望读者明白 `sqrt(n)` 的含义,因为等会还会用到。 81 | 82 | 83 | ### 高效实现 `countPrimes` 84 | 85 | 高效解决这个问题的核心思路是和上面的常规思路反着来: 86 | 87 | 首先从 2 开始,我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8... 都不可能是素数了。 88 | 89 | 然后我们发现 3 也是素数,那么 3 × 2 = 6, 3 × 3 = 9, 3 × 4 = 12... 也都不可能是素数了。 90 | 91 | 看到这里,你是否有点明白这个排除法的逻辑了呢?先看我们的第一版代码: 92 | 93 | ```java 94 | int countPrimes(int n) { 95 | boolean[] isPrim = new boolean[n]; 96 | // 将数组都初始化为 true 97 | Arrays.fill(isPrim, true); 98 | 99 | for (int i = 2; i < n; i++) 100 | if (isPrim[i]) 101 | // i 的倍数不可能是素数了 102 | for (int j = 2 * i; j < n; j += i) 103 | isPrim[j] = false; 104 | 105 | int count = 0; 106 | for (int i = 2; i < n; i++) 107 | if (isPrim[i]) count++; 108 | 109 | return count; 110 | } 111 | ``` 112 | 113 | 如果上面这段代码你能够理解,那么你已经掌握了整体思路,但是还有两个细微的地方可以优化。 114 | 115 | 首先,回想刚才判断一个数是否是素数的 `isPrime` 函数,由于因子的对称性,其中的 for 循环只需要遍历 `[2,sqrt(n)]` 就够了。这里也是类似的,我们外层的 for 循环也只需要遍历到 `sqrt(n)`: 116 | 117 | ```java 118 | for (int i = 2; i * i < n; i++) 119 | if (isPrim[i]) 120 | ... 121 | ``` 122 | 123 | 除此之外,很难注意到内层的 for 循环也可以优化。我们之前的做法是: 124 | 125 | ```java 126 | for (int j = 2 * i; j < n; j += i) 127 | isPrim[j] = false; 128 | ``` 129 | 130 | 这样可以把 `i` 的整数倍都标记为 `false`,但是仍然存在计算冗余。 131 | 132 | 比如 `n = 25`,`i = 4` 时算法会标记 4 × 2 = 8,4 × 3 = 12 等等数字,但是这两个数字已经被 `i = 2` 和 `i = 3` 的 2 × 4 和 3 × 4 标记了。 133 | 134 | 我们可以稍微优化一下,让 `j` 从 `i` 的平方开始遍历,而不是从 `2 * i` 开始: 135 | 136 | ```java 137 | for (int j = i * i; j < n; j += i) 138 | isPrim[j] = false; 139 | ``` 140 | 141 | 这样,素数计数的算法就高效实现了,其实这个算法有一个名字,叫做 Sieve of Eratosthenes。看下完整的最终代码: 142 | 143 | ```java 144 | int countPrimes(int n) { 145 | boolean[] isPrim = new boolean[n]; 146 | Arrays.fill(isPrim, true); 147 | for (int i = 2; i * i < n; i++) 148 | if (isPrim[i]) 149 | for (int j = i * i; j < n; j += i) 150 | isPrim[j] = false; 151 | 152 | int count = 0; 153 | for (int i = 2; i < n; i++) 154 | if (isPrim[i]) count++; 155 | 156 | return count; 157 | } 158 | ``` 159 | 160 | **该算法的时间复杂度比较难算**,显然时间跟这两个嵌套的 for 循环有关,其操作数应该是: 161 | 162 | n/2 + n/3 + n/5 + n/7 + ... 163 | = n × (1/2 + 1/3 + 1/5 + 1/7...) 164 | 165 | 括号中是素数的倒数。其最终结果是 O(N * loglogN),有兴趣的读者可以查一下该算法的时间复杂度证明。 166 | 167 | 以上就是素数算法相关的全部内容。怎么样,是不是看似简单的问题却有不少细节可以打磨呀? 168 | 169 | 170 | 171 | **_____________** 172 | 173 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 174 | 175 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 176 | 177 |

178 | 179 |

180 | ======其他语言代码====== 181 | 182 | [204.计数质数](https://leetcode-cn.com/problems/count-primes) 183 | 184 | ### C++ 185 | 采用的算法是埃拉托斯特尼筛法 186 | 埃拉托斯特尼筛法的具体内容就是:**要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。** 187 | 同时考虑到大于2的偶数都不是素数,所以可以进一步优化成:**要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的奇数倍剔除,剩下的奇数就是素数。** 188 | 此算法其实就是上面的Java解法所采用的。 189 | 190 | 这里提供C++的代码: 191 | ```C++ 192 | class Solution { 193 | public: 194 | int countPrimes(int n) { 195 | int res = 0; 196 | bool prime[n+1]; 197 | for(int i = 0; i < n; ++i) 198 | prime[i] = true; 199 | 200 | for(int i = 2; i <= sqrt(n); ++i) //计数过程 201 | { //外循环优化,因为判断一个数是否为质数只需要整除到sqrt(n),反推亦然 202 | if(prime[i]) 203 | { 204 | for(int j = i * i; j < n; j += i) //内循环优化,i*i之前的比如i*2,i*3等,在之前的循环中已经验证了 205 | { 206 | prime[j] = false; 207 | } 208 | } 209 | } 210 | for (int i = 2; i < n; ++i) 211 | if (prime[i]) res++; //最后遍历统计一遍,存入res 212 | 213 | return res; 214 | } 215 | }; 216 | ``` 217 | 218 | 219 | 220 | ### javascript 221 | 222 | ```js 223 | var countPrimes = function (n) { 224 | let isPrime = new Array(n); 225 | isPrime.fill(true, 0, n) 226 | 227 | // 计数过程 228 | // 外循环优化,因为判断一个数是否为质数只需要整除到sqrt(n),反推亦然 229 | for (let i = 2; i * i < n; i++) { 230 | if (isPrime[i]) { 231 | // 内循环优化,i*i之前的比如i*2,i*3等,在之前的循环中已经验证了 232 | for (let j = i * i; j < n; j += i) { 233 | isPrime[j] = false; 234 | } 235 | } 236 | } 237 | 238 | let res = 0; 239 | for (let i = 2; i < n; i++) { 240 | //最后遍历统计一遍,存入res 241 | if (isPrime[i]) res++; 242 | } 243 | return res; 244 | }; 245 | ``` 246 | 247 | 248 | 249 | -------------------------------------------------------------------------------- /高频面试系列/缺失和重复的元素.md: -------------------------------------------------------------------------------- 1 | # 如何寻找缺失和重复的元素 2 | 3 | 4 |

5 | GitHub 6 | 7 | 8 | 9 |

10 | 11 | ![](../pictures/souyisou.png) 12 | 13 | 相关推荐: 14 | * [手把手带你刷二叉树(第三期)](https://labuladong.gitee.io/algo/) 15 | * [25 张图解:键入网址后,到网页显示,其间发生了什么](https://labuladong.gitee.io/algo/) 16 | 17 | 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 18 | 19 | [645.错误的集合](https://leetcode-cn.com/problems/set-mismatch) 20 | 21 | **-----------** 22 | 23 | 今天就聊一道很看起来简单却十分巧妙的问题,寻找缺失和重复的元素。之前的一篇文章「寻找缺失元素」也写过类似的问题,不过这次的和上次的问题使用的技巧不同。 24 | 25 | 这是 LeetCode 645 题,我来描述一下这个题目: 26 | 27 | 给一个长度为 `N` 的数组 `nums`,其中本来装着 `[1..N]` 这 `N` 个元素,无序。但是现在出现了一些错误,`nums` 中的一个元素出现了重复,也就同时导致了另一个元素的缺失。请你写一个算法,找到 `nums` 中的重复元素和缺失元素的值。 28 | 29 | ```cpp 30 | // 返回两个数字,分别是 {dup, missing} 31 | vector findErrorNums(vector& nums); 32 | ``` 33 | 34 | 比如说输入:`nums = [1,2,2,4]`,算法返回 `[2,3]`。 35 | 36 | 其实很容易解决这个问题,先遍历一次数组,用一个哈希表记录每个数字出现的次数,然后遍历一次 `[1..N]`,看看那个元素重复出现,那个元素没有出现,就 OK 了。 37 | 38 | 但问题是,这个常规解法需要一个哈希表,也就是 O(N) 的空间复杂度。你看题目给的条件那么巧,在 `[1..N]` 的几个数字中恰好有一个重复,一个缺失,**事出反常必有妖**,对吧。 39 | 40 | O(N) 的时间复杂度遍历数组是无法避免的,所以我们可以想想办法如何降低空间复杂度,是否可以在 O(1) 的空间复杂度之下找到重复和确实的元素呢? 41 | 42 | ### 思路分析 43 | 44 | 这个问题的特点是,每个元素和数组索引有一定的对应关系。 45 | 46 | 我们现在自己改造下问题,**暂且将 `nums` 中的元素变为 `[0..N-1]`,这样每个元素就和一个数组索引完全对应了,这样方便理解一些**。 47 | 48 | 如果说 `nums` 中不存在重复元素和缺失元素,那么每个元素就和唯一一个索引值对应,对吧? 49 | 50 | 现在的问题是,有一个元素重复了,同时导致一个元素缺失了,这会产生什么现象呢?**会导致有两个元素对应到了同一个索引,而且会有一个索引没有元素对应过去**。 51 | 52 | 那么,如果我能够通过某些方法,找到这个重复对应的索引,不就是找到了那个重复元素么?找到那个没有元素对应的索引,不就是找到了那个缺失的元素了么? 53 | 54 | 那么,如何不使用额外空间判断某个索引有多少个元素对应呢?这就是这个问题的精妙之处了: 55 | 56 | **通过将每个索引对应的元素变成负数,以表示这个索引被对应过一次了**: 57 | 58 | ![](../pictures/dupmissing/1.gif) 59 | 60 | 如果出现重复元素 `4`,直观结果就是,索引 `4` 所对应的元素已经是负数了: 61 | 62 | ![](../pictures/dupmissing/2.jpg) 63 | 64 | 对于缺失元素 `3`,直观结果就是,索引 `3` 所对应的元素是正数: 65 | 66 | ![](../pictures/dupmissing/3.jpg) 67 | 68 | 对于这个现象,我们就可以翻译成代码了: 69 | 70 | ```cpp 71 | vector findErrorNums(vector& nums) { 72 | int n = nums.size(); 73 | int dup = -1; 74 | for (int i = 0; i < n; i++) { 75 | int index = abs(nums[i]); 76 | // nums[index] 小于 0 则说明重复访问 77 | if (nums[index] < 0) 78 | dup = abs(nums[i]); 79 | else 80 | nums[index] *= -1; 81 | } 82 | 83 | int missing = -1; 84 | for (int i = 0; i < n; i++) 85 | // nums[i] 大于 0 则说明没有访问 86 | if (nums[i] > 0) 87 | missing = i; 88 | 89 | return {dup, missing}; 90 | } 91 | ``` 92 | 93 | 这个问题就基本解决了,别忘了我们刚才为了方便分析,假设元素是 `[0..N-1]`,但题目要求是 `[1..N]`,所以只要简单修改两处地方即可得到原题的答案: 94 | 95 | ```cpp 96 | vector findErrorNums(vector& nums) { 97 | int n = nums.size(); 98 | int dup = -1; 99 | for (int i = 0; i < n; i++) { 100 | // 现在的元素是从 1 开始的 101 | int index = abs(nums[i]) - 1; 102 | if (nums[index] < 0) 103 | dup = abs(nums[i]); 104 | else 105 | nums[index] *= -1; 106 | } 107 | 108 | int missing = -1; 109 | for (int i = 0; i < n; i++) 110 | if (nums[i] > 0) 111 | // 将索引转换成元素 112 | missing = i + 1; 113 | 114 | return {dup, missing}; 115 | } 116 | ``` 117 | 118 | 其实,元素从 1 开始是有道理的,也必须从一个非零数开始。因为如果元素从 0 开始,那么 0 的相反数还是自己,所以如果数字 0 出现了重复或者缺失,算法就无法判断 0 是否被访问过。我们之前的假设只是为了简化题目,更通俗易懂。 119 | 120 | ### 最后总结 121 | 122 | 对于这种数组问题,**关键点在于元素和索引是成对儿出现的,常用的方法是排序、异或、映射**。 123 | 124 | 映射的思路就是我们刚才的分析,将每个索引和元素映射起来,通过正负号记录某个元素是否被映射。 125 | 126 | 排序的方法也很好理解,对于这个问题,可以想象如果元素都被从小到大排序,如果发现索引对应的元素如果不相符,就可以找到重复和缺失的元素。 127 | 128 | 异或运算也是常用的,因为异或性质 `a ^ a = 0, a ^ 0 = a`,如果将索引和元素同时异或,就可以消除成对儿的索引和元素,留下的就是重复或者缺失的元素。可以看看前文「寻找缺失元素」,介绍过这种方法。 129 | 130 | 131 | 132 | **_____________** 133 | 134 | **刷算法,学套路,认准 labuladong,公众号和 [在线电子书](https://labuladong.gitee.io/algo/) 持续更新最新文章**。 135 | 136 | **本小抄即将出版,微信扫码关注公众号,后台回复「小抄」限时免费获取,回复「进群」可进刷题群一起刷题,带你搞定 LeetCode**。 137 | 138 |

139 | 140 |

141 | ======其他语言代码====== 142 | 143 | [645.错误的集合](https://leetcode-cn.com/problems/set-mismatch) 144 | 145 | 146 | 147 | ### java 148 | 149 | [zhuli](https://github.com/1097452462 "zhuli")提供的Java代码: 150 | ```java 151 | class Solution { 152 | public int[] findErrorNums(int[] nums) { 153 | int n = nums.length; 154 | int dup = -1; 155 | for (int i = 0; i < n; i++) { 156 | // 元素是从 1 开始的 157 | int index = Math.abs(nums[i]) - 1; 158 | // nums[index] 小于 0 则说明重复访问 159 | if (nums[index] < 0) 160 | dup = Math.abs(nums[i]); 161 | else 162 | nums[index] *= -1; 163 | } 164 | int missing = -1; 165 | for (int i = 0; i < n; i++) 166 | // nums[i] 大于 0 则说明没有访问 167 | if (nums[i] > 0) 168 | // 将索引转换成元素 169 | missing = i + 1; 170 | return new int[]{dup, missing}; 171 | } 172 | } 173 | ``` 174 | 175 | 176 | 177 | ### javascript 178 | 179 | ```js 180 | /** 181 | * @param {number[]} nums 182 | * @return {number[]} 183 | */ 184 | var findErrorNums = function (nums) { 185 | let n = nums.length; 186 | let dup = -1; 187 | for (let i = 0; i < n; i++) { 188 | // 现在的元素是从1开始的 189 | let index = Math.abs(nums[i]) - 1; 190 | if (nums[index] < 0) { 191 | dup = Math.abs(nums[i]); 192 | } else { 193 | nums[index] *= -1; 194 | } 195 | } 196 | 197 | let missing = -1; 198 | for (let i = 0; i < n; i++) { 199 | if (nums[i] > 0) { 200 | // 将索引转换成元素 201 | missing = i + 1; 202 | } 203 | } 204 | 205 | return [dup, missing] 206 | }; 207 | ``` 208 | 209 | --------------------------------------------------------------------------------