
数据结构和算法
文章平均质量分 78
数据结构和算法
王YANLONG
技术总结,自我沉淀
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
leetcode:最小覆盖字符串
对于算法题目,自己能想到的往往是最基础的笨方法。代码如下:如果t的长度是len1,s的长度是len2,那么最小窗口是len1,最大窗口是len2。所以可以从len1到len2,遍历窗口大小,对于每个窗口大小,将窗口从前向后进行移动。因为窗口是从小到大进行遍历,所以第一次遇到满足条件的子串时,就可以直接范围。这种算法的时间复杂度是O(n*n),在leetcode上运行会超时。原创 2025-05-04 18:44:30 · 395 阅读 · 0 评论 -
递归下降算法
在软件开发中有这样一个需求,开发语言是c++,用户可以通过配置指定任务依赖的事件,比如配置e1|e2|e3的意思是,e1、e2、e3 3个事件,只要有一个到来,那么条件就是满足的,任务可以执行;在比如,用户还可以配置(2*e1 | e2) & e3,这样复杂的逻辑,表示e3是必要的,另外e1到来两次或者e2到来一次也是必要的。事件的个数不仅仅是3个,还可以更多,逻辑关系包含|表示或,&表示与,*表示时间到来的次数,逻辑关系可以任意组合。之前只听说和使用过递归算法,递归算法就是在函数内部调用函数本身。原创 2025-05-04 18:15:41 · 315 阅读 · 0 评论 -
leetcode:单词距离
遍历数组,当遍历到word1时更新index1,遍历到word2时更新index2。当index1和index2均不为-1时,则计算两者之差,如果两者之差比上一次计算的值小,则进行更新,否则不更新。对于这种情况,上边的两种方式,都可以解决,缺点是时间复杂度偏高。想要避免这种重复的工作,可以在第一次遍历的时候将每个单词的下标用map保存下来,map的key是word,value是单词下标的vector,单词下标从小到大进行存放。题干中说,如果文件多次输入,并且每次的两个单词都不相同,能不能优化?原创 2025-03-08 10:10:41 · 297 阅读 · 0 评论 -
合并两个排序的数组
方法二中使用了一个临时数组,先将数据放到临时数组中,排序完成之后,再将数据放回数组A中。为了避免数据被覆盖的情况,可以使用一个临时数组,还可以使用从后向前的方法。4个判断分支还可以优化,4种分类情况可以分为两类,主要是情况2和情况3两类,情况1和情况2可以属于其中的一类。最先想到的一种方法,也是最基础、最直接的方法,就是将B中的数据追加到A数组中,然后排序。③在快速排序中,首先要选定一个值,然后要确定这个值在数组中的位置,也需要从左和从右向中间进行比较,也会用到双指针。原创 2024-12-08 08:47:28 · 435 阅读 · 0 评论 -
leetcode 数组中第k个最大元素
给定一个整数数组,返回数组的第k个最大的元素。(1)很容易能想到,可以先对数组进行排序,排序之后,nums[size - k ]就是想要的结果。排序算法可以使用选择排序、交换排序、插入排序、堆排序、快速排序、归并排序。前3种排序算法的时间复杂度为O(n * n),后3种排序算法的事件复杂度是O(nlogn)。在实际使用中,常常使用堆排序或者快速排序,堆排序是选择排序的思想,快速排序是交换排序的思想。(2)使用堆排序或者快速排序,需要把数组整体排序完成吗?不需要。原创 2024-11-21 07:18:17 · 610 阅读 · 0 评论 -
leetcode判断二分图
图的问题肯定要用到深度优先遍历或者广度优先遍历,但又不是单纯的深度优先遍历算法和广度优先遍历算法,而是需要在遍历的过程中加入与解决题目相关的逻辑。题干中说了,这个图可能不是连通图,这个提示有什么作用呢?很多时候我们接触的题目,图都是连通的,对于连通图来说,从一个点开始遍历,不管是深度优先还是广度优先,遍历一遍就可以把图中的所有点都遍历到;而对于非连通图来说,从一个点开始遍历,就无法将所有点都遍历一遍,这就需要针对每个点都进行一次遍历。原创 2024-07-06 14:21:22 · 420 阅读 · 0 评论 -
leetcode LRU 缓存
所以需要使用链表来表示缓存,当访问一个数据的时候需要将当前这个数据从原来的位置上删除,然后加到链表的头部,删除一个节点的话,需要将这个节点的前一个节点和下一个节点连接起来,如果使用单向链表的话,那么只能找到这个节点的下一个节点,找不到上一个节点,所以需要使用双向链表。(6)向缓存中放入数据 1,此时缓存是满的,所以需要先淘汰一个数据,从访问时间来看,最后一次访问 50 的间隔时间最长,也就是排在最右边的数据,所以将 50 淘汰,其它数据向后移动,将新数据 1 放入最左边的位置。原创 2024-06-15 08:36:21 · 919 阅读 · 0 评论 -
leetcode 数组排序
leetcode:排序算法包括基础的选择排序、插入排序、交换排序;也包括快速排序,堆排序,归并排序等。其中快速排序是交换排序的升级版;堆排序是选择排序的升级版。那插入排序有没有升级版呢,也是有的,是希尔排序,但是希尔排序的思想不好理解,所以本文中不涉及希尔排序。选择排序,插入排序,交换排序属于基础排序算法,时间复杂度是O(n * n)。快速排序和堆排序的时间复杂度是 O(nlogn)。原创 2024-06-09 12:36:23 · 1044 阅读 · 0 评论 -
leetcode 所有可能的路径(图的遍历:深度优先和广度优先)
对于无向图来说,图中的边没有方向,两个节点之间只可能存在一条边,比如 0 和 1 之间的边,因为是无向图,这条边可以表示从 0 到 1 的边,也可以表示从 1 到 0 的边。当对图做遍历时,如果图是连通的,那么从一个节点开始,遍历一次,就能将图中所有的节点遍历一遍,所以遍历一次就可以了。连通图,指的是从一个节点出发沿着边进行遍历,能把图中的节点都遍历到的图。有环图说的是从一个节点开始遍历,在遍历过程中还能遍历到这个节点的图,除了开始节点和结束节点是相同的,其它节点不能重复出现,并且路径长度大于 2。原创 2024-06-08 14:05:29 · 1286 阅读 · 0 评论 -
回文串算法题
回文串是一个正着读和反着读顺序一样的字符串。"aba" 是回文串,"abba" 是回文串,"abc" 不是回文串。回文串的题目,都要使用一个基本的逻辑,就是判断当前这个字符串是不是回文串。以 c++ 为例,代码如下。这种方法也可以称为双指针法,两个指针从字符串的两端向中间遍历每个字符,如果中间发现两个字符不相同,则不是回文字符串;遍历到最后,说明是回文串。双指针法,在其它数据结构题目中也会用到,比如链表中会用到快慢指针,也属于双指针。原创 2024-06-02 10:47:38 · 1152 阅读 · 0 评论 -
用队列实现栈,用栈实现队列
有两个地方会讨论到栈,一个是程序运行的栈空间,一个是数据结构中的栈,本文中讨论的是后者。栈是一个先入后出,后入先出的数据结构,只能操作栈顶。栈有两个操作,push 和 pop,push 是向将数据压栈,pop 是将数据出栈。栈还有一个操作 top,这个操作可以查看栈顶的元素,不会出栈。队列是一种先入先出,后入后出的数据结构。原创 2024-05-25 11:18:22 · 908 阅读 · 0 评论 -
动态规划(背包、组合之和...)
假设有一个背包,体积是 V,另外有 n 个物品,物品的体积分别是 v1, v2, ... vn,每个物品的价值是 w1, w1, ... wn。求怎么将物品放到背包里,才能使背包中物品的价值最大?背包问题是一个典型的动态规划问题。动态规划问题中经常包含一个最字,比如最大价值?最短路径?动态规划问题的求解思路包括以下几点:(1)只看眼前利益动态规划,关键字是动态,也就是说结果是在变化的。在计算过程中,只看眼前利益,只要当前这种情况满足要求,那么这就是中间的一个结果。下边的代码是找数组的最大值。原创 2024-05-18 12:28:52 · 1038 阅读 · 0 评论 -
链表算法题总结
链表作为一个基础的数据结构,在开发中经常被使用。链表往往使用如下的数据结构来表示,struct node 表示链表中的一个节点,data 表示节点的数据;next 表示这个节点指向的下一个节点,如果是链表的尾节点,那么 next 是空。在使用链表的时候,head 指针是需要维护的,head 是链表的头节点。在使用中,head 可以包含具体的数据,表示链表的第一个节点;head 也可以不包含数据,head->next 表示链表的第一个节点。原创 2024-05-01 06:27:47 · 877 阅读 · 0 评论 -
堆排序算法
堆是一棵二叉树,有以下几个约束条件:(1)用数组表示(2)是一棵完全二叉树所谓完全二叉树就是用数组表示的时候,孩子节点的下标和父节点的下标满足如下的关系:下标从 0 开始。下图中,左边的二叉树是完全二叉树,右边的二叉树不是完全二叉树。(3)分大顶堆和小顶堆如果子节点的数值都不大于父节点,那么堆是大顶堆。如果子节点的数值都不小于父节点,那么堆是小顶堆。下图中,左边是大顶堆,右边是小顶堆。原创 2024-04-20 17:23:31 · 516 阅读 · 0 评论 -
二叉树遍历算法和应用
二叉树是指度为 2 的树。它是一种最简单却又最重要的树,在计算机领域中有这广泛的应用。二叉树的递归定义如下:二叉树是一棵空树,或者一棵由一个根节点和两棵互不相交的分别称为根节点的左子树和右子树所组成的非空树,左子树和右子树同样都是一棵二叉树。在二叉树中,每个节点的左子树的根节点被称为左孩子节点,右子树被称为右孩子节点。二叉树通常使用如下数据结构来表示:data 表示二叉树节点的数值,left_child 表示节点的左孩子节点,right_child 表示节点的右孩子节点。原创 2024-04-13 14:00:30 · 1449 阅读 · 0 评论