数据结构与算法

  14 mins read  

开源笔记:数据结构与算法

该笔记主要包含两方面:

  • 数据结构:

    阅读了书籍《数据结构(Python版)》和《数据结构(C语言版)》,其中实现了常用的数据结构如链表、栈、队列、树等,以及常见的内排序算法。目前只实现了 Python 版,后续会陆续更新 C++ 版。

  • 算法:

    算法方面主要是通过编程的方式,在各大 OJ 编程网站中实战学习。遇到不会的知识点就解决不会的知识点。坚信见识的多了,就能将知识点串起来,整理成体系。

后续会陆续为每一道题目增加知识点标签,并增加 C++ 的解决方案,持续更新中!

该笔记的展示如下:

简单函数实现

int2strstr2intstrcatstrcmpstrcpymemcpystrstrswapInt
swapStrstrlen      

常用排序算法

排序算法平均最好最坏空间复杂度稳定性实现实现适用的数据规模
直接插入n^2nn^21稳定PythonC++
希尔排序n^1.3nn^21不稳定PythonC++ 
直接选择n^2n^2n^21不稳定PythonC++
堆排序nlog2nnlog2nnlog2n1不稳定 C++
冒泡排序n^2nn^21稳定PythonC++
快速排序nlog2nnlog2nn^2nlog2n不稳定PythonC++
归并排序nlog2nnlog2nnlog2nn稳定PythonC++

数据结构

数据结构实现实现
链表PythonC++
双向链表Python 
Python 
队列PythonC++
双向队列Python 
循环队列Python 
二叉树Python 
二叉排序树 C++

栈与队列

题目题目出处实现实现知识点难度
用两个栈实现队列剑指-9PythonC++  
包含min函数的栈剑指-30PythonC++  
栈的压入弹出序列剑指-31PythonC++  

链表

| 题目 | 题目出处 | 实现 | 实现 | 知识点 | 难度 | | :———————————————————-: | :———————————————————-: | :———————————————————-: | :———————————————————-: | :——: | :–: | | 反向打印链表 | 剑指-6 | Python | C++ | | | | 删除链表的结点 | 剑指-18 | Python | C++ | | | | 删除链表的重复结点 | 剑指-18扩展 | Python | C++ | | | | 链表的中间节点 | 力扣-876 | | C++ | 快慢指针 | 1 | | 回文链表 | 力扣-234 | | | 快慢指针 | 2 | | 链表中倒数第k个节点 | 剑指-22 | Python | C++ | 快慢指针 | 2 | | 链表中环的入口结点 | 剑指-23 | Python | C++ | | | | 反转链表 | 剑指-24 | Python | C++ | | | | 合并两个排序的链表 | 剑指-25 | Python | C++ | | | | 两数相加 | 力扣-2 | Python | C++ | | | | 两个列表的第一个公共结点 | 剑指-52 | Python | C++ | 快慢指针 | 2 | | 对链表进行插入排序 | 力扣-147 | | | | |

| 题目 | 题目出处 | 实现 | 实现 | 知识点 | 难度 | | :———————————————————-: | :———————————————————-: | :———————————————————-: | :———————————————————-: | :——: | :–: | | 重建二叉树 | 剑指-7 | Python | C++ | | | | 二叉树的下一个结点 | 剑指-8 | Python | | | | | 树的子结构 | 剑指-26 | Python | C++ | | | | 二叉树的镜像 | 剑指-27 | Python | C++ | | | | 对称二叉树 | 剑指-28 | Python | C++ | | | | 从上到下打印二叉树 | 剑指-32 | Python | C++ | | | | 按层打印二叉树 | 剑指-32扩展 | Python | C++ | | | | 按“之”字形打印二叉树 | 剑指-32扩展 | Python | C++ | | | | 二叉搜索树的后序遍历 | 剑指-33 | Python | | | | | 二叉树中和位某一值的路径 | 剑指-34 | Python | C++ | | | | 二叉搜索树与双向链表 | 剑指-36 | Python | | | | | 二叉搜索树的第k大节点 | 剑指-54 | Python | | 树的遍历 | 2 | | 二叉树的深度 | 剑指-55 | Python | | 递归 | 1 |

图与回溯

| 题目 | 题目出处 | 实现 | 实现 | 知识点 | 难度 | | :———————————————————-: | :———————————————————-: | :———————————————————-: | :———————————————————-: | :————–: | :–: | | 矩阵中的路径 | 剑指-12 | Python | | | 3 | | 机器人的运动范围 | 剑指-13 | Python | C++ | | 2 | | 岛屿数量 | 力扣-200 | Python | C++ | DFS,BFS,并查集 | 4 |

数组与字符串

题目题目出处实现实现知识点难度
字符串的全排列剑指-38PythonC++ 2
顺时针打印矩阵剑指-29Python  2
替换空格剑指-5Python  1
两数之和力扣-1PythonC++哈希1
三数之和力扣-15  双指针 
四数相加 II力扣-454    
两数之和之数组有序剑指-57,力扣-167Python 双指针1
验证回文串力扣-125PythonC++双指针1
删除排序数组中的重复项力扣-26PythonC++ 1
实现strStr力扣-28PythonC++  
旋转图像力扣-48Python   
加一力扣-66PythonC++ 1
旋转数组力扣-189PythonC++  
两个数组的交集力扣-349Python   
两个数组的交集扩展力扣-350Python   
字符串中的第一个唯一字符力扣-387PythonC++哈希1
判断子序列力扣-392PythonC++  
反转单词顺序剑指-58   1
左旋转字符串剑指58-扩展   1
最长公共前缀力扣-14   1
寻找峰值力扣-162  二分 
递增的三元子序列力扣-334    
跳跃游戏力扣-55    
根据身高重建队列力扣-406    
接雨水力扣-42   3

排序与搜索

题目题目出处实现实现知识点难度
数组中重复的数字剑指-3PythonC++  
数组中重复的数字扩展剑指3-扩展Python   
二维数组中的查找剑指-4PythonC++  
旋转数组的最小数字剑指-11Python   
调整数组顺序使奇数在偶数前面剑指-21PythonC++  
数组中出现次数超过一半的数字剑指-39Python   
最小的 k 个数剑指-40Python   
搜索插入位置力扣-35PythonC++二分1
颜色排序力扣-75PythonC++排序2
摆动排序力扣-324PythonC++排序2

动态规划

| 题目 | 题目出处 | 实现 | 实现 | 知识点 | 难度 | | :———————————————————-: | :———————————————————-: | :———————————————————-: | :———————————————————-: | :———-: | :–: | | 剪绳子 | 剑指-14 | Python | C++ | | 1 | | 连续子数组的最大和 | 剑指-42 | Python | C++ | | 1 | | 连续子数组的最大积 | 力扣-152 | | | | | | 01背包无价值 | 领扣-92 | Python | C++ | | 1 | | 01背包有价值 | 领扣-125 | Python | C++ | | 1 | | 完全背包 | 领扣 | Python | C++ | | 1 | | 01背包返回方案数 | 领扣-563 | Python | C++ | | 2 | | 完全背包返回方案数 | 领扣-562 | Python | C++ | | 2 | | 买卖股票的最佳时机 | 力扣-121 | Python | C++ | | 1 | | 买卖股票的最佳时机2 | 力扣-122 | Python | C++ | | 1 | | 买卖股票的最佳时机3 | 力扣-123 | Python | C++ | | 3 | | 最长回文子串 | 力扣-5 | Python | C++ | | 3 | | 最长回文子序列 | 力扣-516 | | | | | | 不同路径 | 力扣-62 | Python | C++ | | 1 | | 最小路径和 | 剑指-47,力扣-64 | Python | C++ | | 1 | | 交错字符串 | 力扣-97 | Python | | | 4 | | 打家劫舍 | 力扣-198 | Python | C++ | | 1 | | 零钱兑换 | 力扣-322 | Python | C++ | 完全背包变种 | 2 | | 分割等和子集 | 力扣-416 | Python | C++ | 01背包变种 | 2 | | 一和零 | 力扣-474 | Python | C++ | 多维01背包 | 3 | | 目标和 | 力扣-494 | Python | C++ | 01背包变种 | 3 | | 无重复字符的最长子串 | 剑指-48,力扣-3 | | C++ | | 3 | | 最长上升子序列 | 力扣-300 | | | | 1 | | 最长公共子序列 | 力扣-1143 | | | | |

巧妙

| 题目 | 题目出处 | 实现 | 实现 | 知识点 | 难度 | | :———————————————————-: | :———————————————————-: | :———————————————————-: | :———————————————————-: | :—-: | :–: | | 二进制中1的个数 | 剑指-15 | Python | C++ | 位运算 | | | 汉明距离 | 力扣-461 | | | 位运算 | | | 数值的整数次方 | 剑指-16 | Python | C++ | 递归 | | | x的平方根 | 力扣-69 | Python | | 二分 | | | 有效的完全平方数 | 力扣-367 | Python | | | | | 出现一次的数字 | 力扣-136 | Python | C++ | 位运算 | | | 缺失数字 | 力扣-268 | | | 位运算 | | | 存在重复元素 | 力扣-217 | Python | C++ | | | | 大数加法 | | | | | |

其他

题目题目出处实现实现知识点难度
青蛙跳台阶剑指-10PythonC++数学1
变态跳台阶剑指-10扩展PythonC++数学1
矩阵覆盖剑指-10扩展Python 数学1
正则表达式匹配剑指-19PythonC++ 3
表示数值的字符串剑指-20Python   
把数组排列成最小的数剑指-45Python   
有效数字力扣-65Python 有限状态机3
移动零力扣-283Python   
猜数字大小力扣-374Python   
朋友圈力扣-547Python 并查集3