随笔分类 - 数据结构与算法
摘要:第十六周 2 的 n 次幂 高精度乘法 #include<bits/stdc++.h> using namespace std; vector<int> mul(vector<int> &A) { vector<int> C; int t = 0; for (int i = 0; i < A.siz
阅读全文
摘要:红黑树 定义 动机: 二叉查找树查找、插入、删除最坏情况时间复杂度可能退化为 O(n)。 AVL 树很好的限制了数的高度为 O(logn),插入、删除、查找的最坏时间复杂度均为 O(logn);但删除操作最多需要做 O(logn) 次旋转。 红黑树是具有如下特点的二叉查找树: 每个结点是红色或黑色的
阅读全文
摘要:平衡二叉树 定义 动机:二叉查找树的操作实践复杂度由树高度决定,所以希望控制树高,左右子树尽可能平衡。 平衡二叉树(AVL树):称一棵二叉查找树为高度平衡树,当且仅当或由单一外结点组成,或由两个子树形 Ta 和 Tb 组成,并且满足: |h(Ta) - h(Tb)| ⇐ 1,其中 h(T) 表示树
阅读全文
摘要:二叉查找树 定义 二叉查找树(亦称二叉搜索树、二叉排序树)是一棵二叉树,且各结点关键词互异,其中根序列按其关键词递增排列。 等价描述:二叉查找树中任一结点 P,其左子树中结点的关键词都小于 P 的关键词,右子树中结点的关键词都大于 P 的关键词,且结点 P 的左右子树也都是二叉查找树 节点结构 1️
阅读全文
摘要:Trie 树的模板 Trie 树的简介 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。他的核心思想是空间换时间,空间消耗大但是插入和查询有着很优秀的时间复杂度。 Trie 树的定义 Trie树的键不是直接保
阅读全文
摘要:121. 买卖股票的最佳时机 LeetCode 121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利
阅读全文
摘要:快速幂 引入 快速幂是用来解决求幂运算的高效方式。 例如我们要求 x 的 90 次方,一般的方法可以通过一个循环,每次乘一个 x,循环 90 次之后就可以得到答案,时间复杂度为 O(n),效率较低。而通过快速幂,我们可以在 O(log(n)) 的时间复杂度内完成该运算。 具体方法 我们可以通过二进制
阅读全文
摘要:问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据。 比较直接的想法是利用随机数算法,求 random(N) 得到随机数,但是题目表明数据流极大,这种大数据量是无法一次都读到内存的,
阅读全文
摘要:前置说明 不了解二叉树非递归遍历的可以看我之前的文章【数据结构与算法】二叉树模板及例题 Morris 遍历 概述 Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1) 。通过利用原树中大量空闲指针的方式,达到节省空间的目的 分析 设一棵二叉树有 n 个节点,则所有
阅读全文
摘要:中缀表达式转后缀表达式 方式一 步骤 1️⃣ 如果遇到操作数,我们就直接将其输出。 2️⃣ 如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。 3️⃣ 如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。 4️⃣ 如果遇到任何其他
阅读全文
摘要:链表模板 链表结构 public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.
阅读全文
摘要:前缀和 一维前缀和 前缀和数组 sum 的每一位记录的是当前位置距离起点位置,这连续一段的和区间和。 利用前缀和数组,我们可以快速得到数组任意区间的元素和。 构造前缀和数组的时间复杂度是O(n),获得区间和的复杂度是O(1) 当nums数组的元素下标从0开始算时,需要做出一些调整 模板和例题 Lee
阅读全文
摘要:图的存储结构 邻接矩阵 适用于边数较多的情况,采用二维数组存储 // 邻接矩阵数组:w[from][to] = weight 代表从 from 到 to 有权重为 weight 的边 int[][] w = new int[N][N]; // 加边操作 void add(int from, int
阅读全文
摘要:二叉树节点结构 class Node<V>{ V value; Node left; Node right; } 二叉树的遍历(递归) 先序遍历 顺序:根左右 public static void preOrderRecur(Node head) { if (head == null) { retu
阅读全文
摘要:概念 简介 在计算机科学里, 后缀数组(英语:suffix array)是一个通过对字符串的所有后缀经过排序后得到的数组。此数据结构被运用于全文索引、数据压缩算法、以及生物信息学。 后缀字符串 后缀字符串:从后往前依次递增截取的字符串。长度为 n 的字符串有 n 个后缀 后缀数组和rank数组 后缀
阅读全文
摘要:Rabin-Karp 算法 概念 用于在 一个字符串 中查找 另外一个字符串 出现的位置。 与暴力法不同,基本原理就是比较字符串的 哈希码 ( HashCode ) , 快速的确定子字符串是否等于被查找的字符串 比较哈希值采用的是滚动哈希法 如何计算哈希值: 如 : “abcde” 的哈希码值为 \
阅读全文
摘要:概念 过程 分解:将n 个元素分成个含n/2 个元素的子序列; 解决:对两个子序列递归地排序 合并:合并两个已排序的子序列以得到排序结果 和快排不同的是 归并的分解较为随意 重点是合并 需要额外开辟数组空间 代码实现 public static void mergeSort(int[] arr){
阅读全文
摘要:计数排序 概念 一句话︰用辅助数组对数组中出现的数字计数,元素转下标,下标转元素 假设元素均大于等于0,依次扫描原数组,将元素值k记录在辅助数组的k位上 思路:开辟新的空间,空间大小为max(source)扫描source,将value作为辅助空间的下标,用辅助空间的改位置元素记录value的个数。
阅读全文
摘要:树、二叉树的简单介绍 可以用数组表示一颗二叉树(数组下标从0开始) 左子节点下标是 2n+1 (n是父节点下标) 右子节点下标是 2n+2 (n是父节点下标) 父节点下标是 (n-1)/2 (n是左子节点或者右子节点下标) 堆的概念 二叉堆是完全二叉树或者是近似完全二叉树 二叉堆满足两个特性: 父节
阅读全文
摘要:概念 快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两个部分独立地排序。递归调用发生在处理整个数组之后。 快速排序算法首先会在序列中随机选择一个基准值(pivot),然后将除了基准值以外的数分为“比基准值小的数”和“比基准值大的数”这两个类别,再将其排列成以下形式。 [ 比基准值小的数
阅读全文