![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构和算法
文章平均质量分 88
数据结构和算法
王燕龙笔记
linux学习总结
展开
-
leetcode判断二分图
图的问题肯定要用到深度优先遍历或者广度优先遍历,但又不是单纯的深度优先遍历算法和广度优先遍历算法,而是需要在遍历的过程中加入与解决题目相关的逻辑。题干中说了,这个图可能不是连通图,这个提示有什么作用呢?很多时候我们接触的题目,图都是连通的,对于连通图来说,从一个点开始遍历,不管是深度优先还是广度优先,遍历一遍就可以把图中的所有点都遍历到;而对于非连通图来说,从一个点开始遍历,就无法将所有点都遍历一遍,这就需要针对每个点都进行一次遍历。原创 2024-07-06 14:21:22 · 320 阅读 · 0 评论 -
leetcode LRU 缓存
所以需要使用链表来表示缓存,当访问一个数据的时候需要将当前这个数据从原来的位置上删除,然后加到链表的头部,删除一个节点的话,需要将这个节点的前一个节点和下一个节点连接起来,如果使用单向链表的话,那么只能找到这个节点的下一个节点,找不到上一个节点,所以需要使用双向链表。(6)向缓存中放入数据 1,此时缓存是满的,所以需要先淘汰一个数据,从访问时间来看,最后一次访问 50 的间隔时间最长,也就是排在最右边的数据,所以将 50 淘汰,其它数据向后移动,将新数据 1 放入最左边的位置。原创 2024-06-15 08:36:21 · 496 阅读 · 0 评论 -
leetcode 数组排序
leetcode:排序算法包括基础的选择排序、插入排序、交换排序;也包括快速排序,堆排序,归并排序等。其中快速排序是交换排序的升级版;堆排序是选择排序的升级版。那插入排序有没有升级版呢,也是有的,是希尔排序,但是希尔排序的思想不好理解,所以本文中不涉及希尔排序。选择排序,插入排序,交换排序属于基础排序算法,时间复杂度是O(n * n)。快速排序和堆排序的时间复杂度是 O(nlogn)。原创 2024-06-09 12:36:23 · 938 阅读 · 0 评论 -
leetcode 所有可能的路径(图的遍历:深度优先和广度优先)
对于无向图来说,图中的边没有方向,两个节点之间只可能存在一条边,比如 0 和 1 之间的边,因为是无向图,这条边可以表示从 0 到 1 的边,也可以表示从 1 到 0 的边。当对图做遍历时,如果图是连通的,那么从一个节点开始,遍历一次,就能将图中所有的节点遍历一遍,所以遍历一次就可以了。连通图,指的是从一个节点出发沿着边进行遍历,能把图中的节点都遍历到的图。有环图说的是从一个节点开始遍历,在遍历过程中还能遍历到这个节点的图,除了开始节点和结束节点是相同的,其它节点不能重复出现,并且路径长度大于 2。原创 2024-06-08 14:05:29 · 953 阅读 · 0 评论 -
回文串算法题
回文串是一个正着读和反着读顺序一样的字符串。"aba" 是回文串,"abba" 是回文串,"abc" 不是回文串。回文串的题目,都要使用一个基本的逻辑,就是判断当前这个字符串是不是回文串。以 c++ 为例,代码如下。这种方法也可以称为双指针法,两个指针从字符串的两端向中间遍历每个字符,如果中间发现两个字符不相同,则不是回文字符串;遍历到最后,说明是回文串。双指针法,在其它数据结构题目中也会用到,比如链表中会用到快慢指针,也属于双指针。原创 2024-06-02 10:47:38 · 1014 阅读 · 0 评论 -
用队列实现栈,用栈实现队列
有两个地方会讨论到栈,一个是程序运行的栈空间,一个是数据结构中的栈,本文中讨论的是后者。栈是一个先入后出,后入先出的数据结构,只能操作栈顶。栈有两个操作,push 和 pop,push 是向将数据压栈,pop 是将数据出栈。栈还有一个操作 top,这个操作可以查看栈顶的元素,不会出栈。队列是一种先入先出,后入后出的数据结构。原创 2024-05-25 11:18:22 · 856 阅读 · 0 评论 -
背包问题(01背包和无限背包)
假设有一个背包,体积是 V,另外有 n 个物品,物品的体积分别是 v1, v2, ... vn,每个物品的价值是 w1, w1, ... wn。求怎么将物品放到背包里,才能使背包中物品的价值最大?背包问题是一个典型的动态规划问题。动态规划问题中经常包含一个最字,比如最大价值?最短路径?动态规划问题的求解思路包括以下几点:(1)只看眼前利益动态规划,关键字是动态,也就是说结果是在变化的。在计算过程中,只看眼前利益,只要当前这种情况满足要求,那么这就是中间的一个结果。下边的代码是找数组的最大值。原创 2024-05-18 12:28:52 · 879 阅读 · 0 评论 -
链表算法题总结
链表作为一个基础的数据结构,在开发中经常被使用。链表往往使用如下的数据结构来表示,struct node 表示链表中的一个节点,data 表示节点的数据;next 表示这个节点指向的下一个节点,如果是链表的尾节点,那么 next 是空。在使用链表的时候,head 指针是需要维护的,head 是链表的头节点。在使用中,head 可以包含具体的数据,表示链表的第一个节点;head 也可以不包含数据,head->next 表示链表的第一个节点。原创 2024-05-01 06:27:47 · 750 阅读 · 1 评论 -
堆排序算法
堆是一棵二叉树,有以下几个约束条件:(1)用数组表示(2)是一棵完全二叉树所谓完全二叉树就是用数组表示的时候,孩子节点的下标和父节点的下标满足如下的关系:下标从 0 开始。下图中,左边的二叉树是完全二叉树,右边的二叉树不是完全二叉树。(3)分大顶堆和小顶堆如果子节点的数值都不大于父节点,那么堆是大顶堆。如果子节点的数值都不小于父节点,那么堆是小顶堆。下图中,左边是大顶堆,右边是小顶堆。原创 2024-04-20 17:23:31 · 359 阅读 · 0 评论 -
二叉树遍历算法和应用
二叉树是指度为 2 的树。它是一种最简单却又最重要的树,在计算机领域中有这广泛的应用。二叉树的递归定义如下:二叉树是一棵空树,或者一棵由一个根节点和两棵互不相交的分别称为根节点的左子树和右子树所组成的非空树,左子树和右子树同样都是一棵二叉树。在二叉树中,每个节点的左子树的根节点被称为左孩子节点,右子树被称为右孩子节点。二叉树通常使用如下数据结构来表示:data 表示二叉树节点的数值,left_child 表示节点的左孩子节点,right_child 表示节点的右孩子节点。原创 2024-04-13 14:00:30 · 977 阅读 · 0 评论