算法通 10 - 快速排序与归并排序
快速排序
参考资料
全网最好懂的快速排序的原理
基本思想
通过枢轴将元素序列划分成左右两个子序列 left 和 right,其中 left 比枢轴小,right 比枢轴大,然后再对枢轴左右两侧递归执行快速排序
荷兰旗思路
quickSort
123456public void quickSort(int[] arr) { if (arr == null || arr.length < 2) { return; } quickSort(arr, 0, arr.length - 1);}
12345678910public void quickSort(int[] arr, int left, int right) { if (left < right) { // 等概率随机选一个位置,把他跟最右边的数字交换 swap(arr, left + (int)(Math.random() * (right - left + 1)), right); ...
算法通关 9 - 二分查找与二叉树的中序遍历
二分查找与二叉树的中序遍历—二分查找
通关进度
题目
说明
二分查找
通关
递归和迭代的二分查找
通关
存在重复元素的二分查找
通关
参考资料
二叉树的中序遍历与二分查找问题
基本查找12345678public int search(int[] arr, int key) { for (int i = 0; i < arr.length; i++) { if (arr[i] == key) { return i; } } return -1; }
二分查找与分治
迭代方式
1234567891011121314public int binarySearch(int[] array, int low, int high, int target) { while (low <= high) { int mid = low + ((high - l ...
算法通关 8 二叉树 DFS 问题
二叉树 DFS 问题—经典问题
通关进度
题目
说明
判断两棵树是否相同
通关
判断两棵树是否对称
通关
合并两棵二叉树
通关
寻找二叉树所有路径
通关
路径总和问题
通关
翻转二叉树
通关
二叉树中的双指针判断两棵树是否相同 100. 相同的树
问题
【LeetCode 100】:给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
DFS
如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。
如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。
1234567891011121314public boolean isSameTree(TreeNode p, TreeNode q) { // 如果两个都为空 if (p == null && q == ...
算法通关 7 - 二叉树三种遍历方式
递归遍历先序遍历 144. 二叉树的前序遍历
问题
【LeetCode 144】:给你二叉树的根节点 root ,返回它节点值的 前序遍历。
12345678910111213141516public List<Integer> preorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<>(); preorder(root, ans); return ans;}public void preorder(TreeNode root, List<Integer> res) { if (root == null) { return; } res.add(root.val); preorder(root.left, res); preorder(root.right, res);}
中序遍历 94. 二叉树的中序遍历
问题
【LeetCode 94】:给定一个 ...
算法通关 6 - 二叉树专题Ⅰ
二叉树专题Ⅰ—树结构
通关进度
题目
说明
使用前中序列构造二叉树
通关
使用中后序列构造二叉树
通关
树的常见概念树是一个有 $n$ 个有限节点组成一个具有层次关系的集合,每个节点有 $0$ 个或者多个子节点,没有父节点的节点称为根节点
节点的度:一个节点含有的子节点的个数称为该节点的度
树的度:一棵树中,最大的节点的度称为树的度,注意与节点度的区别
叶节点或终端节点:度为 $0$ 的节点称为叶节点
非终端节点或分支节点:度不为 $0$ 的节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点
节点的祖先:从根到该节点所经分支上的所有节点
子孙:以某节点为根的子树中任一节点都称为该节点的子孙
森林:由 $m(m>=0)$ 棵互不相交的树的集合称为森林
无序树:树中任意节点的子节点之间没有顺序关系,也称为自由树:
有序树:树中任意节点的子节点之间有顺序关系
二叉树:每人节点最多含有两人子树的树称为二叉树
树的性质
...
算法通关 5 - 哈希和队列专题
哈希和队列专题—队列和 Hash 的特征
通关进度
Hash 存储原理
Hash 处理冲突的方法
队列存储的基本特征
使用链表实现队列
参考资料
队列缓存、Hash 与缓存设计问题
Hash 基础
Hash 概念和基本特征
Hash(哈希)是一种将数据映射到固定长度的数字串(哈希值)的过程,通常用于数据的唯一标识、索引、加密等应用。哈希函数是执行这种映射的算法。
Hash 碰撞处理
链地址法(Separate Chaining): 该方法中,每个哈希桶都是一个链表。当多个键映射到同一个哈希码时,它们会被存储在同一个桶中的链表中。这样,相同哈希码的键值对可以共享同一个哈希桶,通过链表来存储。
开放寻址法(Open Addressing):该方法中,当发生冲突时,程序会尝试寻找另一个空的哈希桶,而不是使用链表。
线性探测(Linear Probing): 当发生哈希冲突时,线性探测会依次检查下一个哈希桶,直到找到一个空的桶或者遍历整个哈希表。这样,冲突的元素会被放置在找到的第一个空桶中。
二次探测(Quadratic Probing): 它使用二次方程来决定下一个探测 ...