
数据结构与算法
文章平均质量分 87
vfdxvffd
这个作者很懒,什么都没留下…
展开
-
图解Leetcode组合总和系列——回溯(剪枝优化)+动态规划
Leetcode组合总和系列——回溯(剪枝优化)+动态规划组合总和 I给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]来源:力扣(L原创 2021-04-29 10:49:42 · 392 阅读 · 0 评论 -
<二分查找+双指针+前缀和>解决子数组和排序后的区间和
<二分查找+双指针+前缀和>解决子数组和排序后的区间和题目重现:给你一个数组 nums ,它包含 n 个正整数。你需要计算所有非空连续子数组的和,并将它们按升序排序,得到一个新的包含 n * (n + 1) / 2 个数字的数组。请你返回在新数组中下标为 left 到 right (下标从 1 开始)的所有数字和(包括左右端点)。由于答案可能很大,请你将它对 10^9 + 7 取模后返回。示例 1:输入:nums = [1,2,3,4], n = 4, left = 1, right原创 2021-01-12 15:40:46 · 235 阅读 · 0 评论 -
常见算法技巧之——双指针思想
常见算法技巧之——双指针思想欢迎访问我的个人主页 双指针思想是指设置两个指针解决一些算法问题。一般用的比较多的就是去解决数组、链表类的问题,还有很耳熟能详的二分查找问题。本文将根据自己平时做题的总结以及在网上看到的其他大佬的总结讲解来讨论一下双指针的使用技巧。本文会根据我平时做题实时更新。快慢指针 双指针的快慢指针用法是我最开始理解的第一种用法。快慢指针一般用来解决链表的问题多一些。设置一快一慢两个指针fast和slow,初始化指向链表表头。1、计算链表的中点 给定一个链表,要求返回原创 2021-01-12 15:39:03 · 378 阅读 · 0 评论 -
五大常见算法策略之——回溯策略
回溯策略欢迎大家访问我的个人搭建的博客Vfdxvffd’s Blog回溯是五大常用算法策略之一,它的核心思想其实就是将解空间看作是一棵树的结构,从树根到其中一个叶子节点的路径就是一个可能的解,根据约束条件,即可得到满足要求的解。求解问题时,发现到某个节点而不满足求解的条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。下面通过几个例子来讨论这个算法策略。货郎问题有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的具有最短路程的环路。(最后回到原创 2021-01-12 14:50:11 · 1149 阅读 · 0 评论 -
五大常见算法策略之——动态规划策略
Dynamic Programming Dynamic Programming是五大常用算法策略之一,简称DP,译作中文是“动态规划”,可就是这个听起来高大上的翻译坑苦了无数人,因为看完这个算法你可能会觉得和动态规划根本没太大关系,它对“动态”和“规划”都没有太深的体现。 举个最简单的例子去先浅显的理解它,有个大概的雏形,找一个数组中的最大元素,如果只有一个元素,那就是它,再往数组里面加元素,递推关系就是,当你知道当前最大的元素,只需要拿当前最大元素和新加入的进行比较,较大的就是数组中最大的,这就是原创 2021-01-12 14:48:15 · 347 阅读 · 0 评论 -
快速排序
快速排序官方说法:快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。通俗来说,就是不断的挖坑和填坑1、其实就是先选择一个基准数,然后这个基准数我们保存为x,那它所在的位置就是一个空出来的坑。2、我们从右向左迭代,如果遇到比基准原创 2021-01-12 14:46:06 · 149 阅读 · 0 评论 -
五大常见算法策略之——递归分治策略
递归与分治策略递归与分治策略是五大常见算法策略之一,分治策略的思想就是分而治之,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的解。而分治与递归很多情况下都是一起结合使用的,能发挥出奇效(1+1>2),这篇文章我们将先从递归说起,再逐渐向分治过渡,主要讲解方式是通过9个例题来说明问题的,问题都是根据难度由简到难,由浅入深,对递归与分治能有个大概的了解雏形,当然最重要还是要做大量练习才能掌握。0、递归 0.0、Fibonacci数原创 2021-01-12 14:42:57 · 418 阅读 · 0 评论 -
数据结构之——八大排序算法
排序算法小汇总1、交换排序类 1.1、冒泡排序 1.2、快速排序2、选择排序类 2.1、简单选择排序 2.2、堆排序3、插入排序类 3.1、直接插入排序 3.2、希尔排序4、归并排序5、基数排序交换排序类冒泡排序(优化) 冒泡排序一般将前面作为有序区(初始无元素),后面作为无序区(初始元素都在无序区里),在遍历过程中把当前无序区最小的数像泡泡一样,让其往上...原创 2019-10-27 14:27:43 · 210 阅读 · 0 评论 -
图的深度优先和广度优先遍历
深度优先遍历 首先我们说一下邻接点的定义,对于无向图,如果两个顶点之间相互连接,那么它们互称为邻接点。 深度优先遍历支持从指定的结点开始遍历。深度优先遍历,也称作深度优先搜索,缩写为DFS。深度优先遍历从某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点触发深度优先遍历图,直至所有和v有路径想通的顶点都被访问到。 上面这段话听起来有点官方还有点笼统,不太好理解,所以我们通俗一点...原创 2019-10-13 11:27:43 · 250 阅读 · 0 评论 -
向图中增加结点
向图中增加结点 我们前面说过采用邻接矩阵来存储图,那么向图中增加结点其实只需要改变顶点数目,以及在邻接矩阵中增加点与点,点与边的关系即可。先看增加结点的函数 就是向函数中传入结点,判断图如果未满就将其存入存放结点的数组,然后给节点数目加一。 //向图中增加顶点 bool addNode(Node* pNode) { if (pNode == NULL) ...原创 2019-10-13 11:26:17 · 574 阅读 · 0 评论 -
图数据类型的定义
图介绍 图是相较于树更复杂的一种数据结构类型,它表示了多对多的对应关系。图的结构其实就是一些顶点和一些边的集合。图又分为有向图和无向图。存储图的方法有很多,比如使用邻接矩阵,邻接表,十字链表和邻接多重表等等。下面我们一一介绍一下这些内容。图的结构:无向图:无向图其实就是说顶点与顶点之间的关系没有方向,只有说是连接的还是断开的。有向图:相对的,有向图就是顶点与顶点之间不...原创 2019-10-13 11:25:10 · 920 阅读 · 0 评论 -
Huffman树及编解码
Huffman树——编解码介绍: Huffman树可以根据输入的字符串中某个字符出现的次数来给某个字符设定一个权值,然后可以根据权值的大小给一个给定的字符串编码,或者对一串编码进行解码,可以用于数据压缩或者解压缩,和对字符的编解码。 可是Huffman树的优点在哪? 1、就在于它对出现次数大的字符(即权值大的字符)的编码比出现少的字符编码短,也就是说出现次数越多,编码越短,保证了...原创 2019-10-13 11:22:42 · 554 阅读 · 0 评论 -
AVL平衡二叉查找树
二叉排序树:定义 二叉排序树,又叫二叉查找树,它或者是一棵空树;或者是具有以下性质的二叉树: 1. 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2. 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 3. 它的左右子树也分别为二叉排序树。 比如下图就是一棵...原创 2019-10-13 11:13:28 · 136 阅读 · 0 评论 -
字符串模式匹配——KMP算法
KMP算法匹配字符串朴素匹配算法 字符串的模式匹配的方法刚开始是朴素匹配算法,也就是经常说的暴力匹配,说白了就是用子串去和父串一个一个匹配,从父串的第一个字符开始匹配,如果匹配到某一个失配了,就重新去从父串的下一个字符开始匹配,这样的算法虽然理解起来容易,但是算法的时间复杂度无疑是很高的,假如父串是一个很长的字符串,而字串恰恰不和父串匹配,那无疑是对CPU的迫害。 下面贴几张图看看这...原创 2019-10-13 11:09:59 · 173 阅读 · 0 评论