
数据结构与算法
文章平均质量分 91
Gatsby_codeLife
这个作者很懒,什么都没留下…
展开
-
前缀树和贪心算法
1.前缀树力扣地址Trie树,又叫字典树、前缀树(Prefix Tree)、单词查找树或键树,是一种多叉树结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。Trie树也有它的缺点,Trie树的内存消耗非常大。基本结构如下图 :[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直原创 2021-09-14 01:30:04 · 307 阅读 · 0 评论 -
无规律总结的算法题
1.魔术操作给一个包含n个整数元素的集合a,一个包含m个整数元素的集合b。 定义magic操作为,从一个集合中取出一个元素,放到另一个集合里,且操作过后每个集合的平均值都大于操作前。 注意以下两点: 1)不可以把一个集合的元素取空,这样就没有平均值了 2)值为x的元素从集合b取出放入集合a,但集合a中已经有值为x的元素,则a的 平均值不变(因为集合元素不会重复),b的平均值可能会改变(因为x被取出了) 问最多可以进行多少次操作思想:要使取完一个数后 两个集合的平均值都变大 则只能取两个平均值之间的数字。原创 2021-08-29 23:44:44 · 424 阅读 · 0 评论 -
KMP、马拉车、滑动窗口、图、并查集
1.KMP算法参考博客问题描述:给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题。java中的String的indexOf方法可以直接返回位置,但是它的方法基本是基于KMP算法的。如果用传统的暴力循环,时间效率肯定非常慢,所以我们可以使用KMP算法算法流程:(1)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0aBuPXp-1630226701641)(KMP、马拉车、滑动窗口、图、并查集.asset原创 2021-08-29 16:45:32 · 452 阅读 · 0 评论 -
链表算法题
1.反转链表(重点)反转链表: 输入一个链表的头节点,反转该链表并输出反转后链表的头节点。假设链表为 1→2→3→∅,反转后为 ∅←1←2←3。在遍历链表时,将当前节点的next指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。public ListNode reverseList(ListNode head) { ListNode pre=null; Li原创 2021-08-26 01:17:14 · 185 阅读 · 0 评论 -
树的算法总结
写在前言(感谢代码随想录博主 博主是c++代码,此刷题总结是java代码,下文是我学习博主刷题记录的笔记)递归三部曲:找终止条件:什么时候递归到头了?思考返回值,每一级递归应该向上返回什么信息?单步操作应该怎么写?因为递归就是大量的调用自身的重复操作,因此从宏观上考虑,只用想想单步怎么写就行了,左树和右树应该看成一个整体,即此时树一共三个节点:root,root.left,root.right。1.二叉树的遍历1.递归版本1.前序遍历;先访问根结点,然后再访问左子树,最后访问右子树2.原创 2021-06-05 14:51:34 · 2916 阅读 · 4 评论 -
回溯算法总结
总结(感谢代码随想录博主 我回溯就在他那学的)回溯算法模板 看到没有 这个模板不特么就是一种尝试吗?国人还搞这么多名词三部曲:回溯函数模板返回值以及参数回溯函数终⽌条件回溯搜索的遍历过程回溯法其遍历过程就是:for循环横向遍历,递归纵向遍历,回溯不断调整结果集void backtracking(参数) { if (终⽌条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩⼦的数量就是集合的⼤⼩)) { 处理节点; backt原创 2021-06-01 20:35:58 · 378 阅读 · 0 评论 -
暴力递归&动态规划
暴力递归就是尝试1:把问题转化为规模缩小了的同类问题的子问题2:有明确的不需要继续进行递归的条件(base case)3:有当得到子问题的结果之后的决策过程4:返回每一个子问题的解给上级调用者暴力递归–>动态规划动态规划就是暴力尝试减少重复计算的技巧而已, 这种技巧就是一个大型套路,先写出用尝试的思路解决问题的递归函数,而不用操心时间复杂度 这个过程是无可替代的,没有套路的,只能依靠个人智慧,或者足够多的经验但是怎么把尝试的版本,优化成动态规划,是有固定套路的,大体步骤如下1)找到什么原创 2021-05-25 23:12:51 · 835 阅读 · 3 评论 -
链表基础算法题
1.反转链表(重点)反转链表: 输入一个链表的头节点,反转该链表并输出反转后链表的头节点。假设链表为 1→2→3→∅,反转后为 ∅←1←2←3。在遍历链表时,将当前节点的next指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。public ListNode reverseList(ListNode head) { ListNode pre=null; Li原创 2021-04-02 14:05:09 · 448 阅读 · 0 评论 -
排序算法
1.异或异或运算的性质与扩展 用来处理奇偶数方便1)0^N == N N^N == 0 也就是说奇数次异或为最后剩下的那个数,偶数次异或为0 2)异或运算满足交换律和结合率 3)不用额外变量交换两个数 :a=a^b b=a^b a=a^b; 这样就完成了两个数的交换一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到这一个数?定义一个变量,由于偶数次异或为0,则异或数组中每个变量,剩下的那个就是奇数一个数组中有两种数出现了奇数次,其他数都出现了偶原创 2021-04-01 16:47:39 · 193 阅读 · 0 评论