随笔分类 -  数据结构与算法

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