![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习
shahuzi
这个作者很懒,什么都没留下…
展开
-
最长上升子序列【动态规划,二分查找】
题目描述给定一个无序的整数数组,找到其中最长上升子序列的长度。输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。解法一 动态规划思路:dp[i]表示直到第i个元素的最长上升子序列的长度,初始条件dp[i]=1。 dp[i]如何更新呢?若第i个值大于其前面某一个元素(假设索引为j),那么dp[i]=dp...原创 2019-07-09 14:53:32 · 6970 阅读 · 0 评论 -
大顶堆 小顶堆 堆排序
基础知识大顶(根)堆与小顶(根)堆都是一种数据结构,它们都是完全二叉树,但是不是用指针链表形式的二叉树,而是使用顺序存储的数组存储元素值。大顶堆及堆顶元素为整个堆中的最大值,小顶堆同理,它可以在O(1)时间内获取最大值。下面以大顶堆讲解一些堆的相关知识,并给出大、小顶堆的代码。首先,既然是顺序存储,且又是完全二叉树的结构,其节点如何存储呢?此处使用二叉树的层次遍历方式存储节点值,本文使用的节点...原创 2019-08-30 19:38:38 · 579 阅读 · 0 评论 -
【图算法】 Dijkstra算法与Floyd算法
Dijkstra算法与Floyd算法分别用于求单源最短路径与多源最短路径,其中Dijkstra算法要求图中所有边的权值为正,而Floyd算法只要求不存在负权环就行(即可以存在负权的边,但是若有环,环的权值和不能为负)。本文在给出这两个算法的求解代码的同时,给出各自求解路径的代码。Dijkstra算法Dijkstra算法是一个贪心算法,其思想是,设置一个从源点到顶点最短距离已知的点的集合S,然...原创 2019-08-29 10:55:37 · 301 阅读 · 0 评论 -
栈相关的题目 【栈的反转,栈的排序】
栈的反转实现栈的逆序,但是只能使用递归函数和栈本身的pop操作。解法:首先定义一个get方法,该方法用于将栈底的元素取出并返回。然后定义reverseStack方法,在该方法中,首先取出栈底元素,然后对移除栈底元素的栈递归调用reverseStack方法,直到栈为空,返回。返回后,将取出的栈底元素一次入栈,这样的话,最后一次取出的栈底元素(实际的栈顶元素)就落在了栈底,从而实现了栈的逆序...原创 2019-08-19 16:20:27 · 258 阅读 · 0 评论 -
顺时针转圈打印数组
所谓顺时针转圈打印数字,即从外往内打印数组,一圈一圈地打印,这是剑指offer的第20题。这个题的思路是这样的:首先,打印的条件是rows>2*start and cols>2*start,然后把打印一圈分为四步首先从左到右打印一行,这一步是任意情况都要执行的,即使只要1行1列;然后从上到下打印一列,这一步的条件是至少有两行;再执行从右到左打印一行,这一步的条件是至少有两...原创 2019-07-31 09:11:00 · 834 阅读 · 0 评论 -
荷兰国旗问题
原始的荷兰国旗问题是:有n个三种颜色的小球,颜色分别为红、白、蓝,要求将这n个小球排序,使得白色在中间,红色在前面,蓝色在后面,且时间复杂度只能是O(N)O(N)O(N),空间复杂度为O(1)O(1)O(1)。由此衍生的问题是:给定一个数组nums和一个目标值target(这个target一定在数组中),要求使得这个数组中小于目标值的元素在左边,等于目标值的元素在中间,大于目标值的元素...原创 2019-07-30 22:43:39 · 132 阅读 · 0 评论 -
旋转数组(顺时针90度,180度,270度)
旋转数组(90∘^{\circ}∘,180∘^{\circ}∘,270∘^{\circ}∘)顺时针旋转90∘^{\circ}∘第一种是用坐标变换法,在网上看到的一种坐标变换:顺时针90∘^{\circ}∘: newArr[i][j]=arr[N-1-j][i]顺时针180∘^{\circ}∘:newArr[i][j]=arr[N-1-i][N-1-j]顺时针270∘^{\circ...原创 2019-07-30 22:15:11 · 7613 阅读 · 1 评论 -
反转链表系列题
1.反转链表反转链表有两种做法:迭代法和递归法,这里两种都写一下1.1 迭代法定义三个指针pPrev,pNode,pNext,分别指向当前节点的前一节点、当前节点、当前节点的后一节点,只要当前节点不为空,就不断地将当前节点的next指向前一节点,然后更新当前节点为下一节点,最后返回pPrev,因为退出条件为当前节点为空节点,故此时pPrev为最后一个节点。(PS:这个代码的前后相连真的是美)...原创 2019-07-24 17:54:08 · 204 阅读 · 0 评论 -
数组中的逆序对
此题来源于剑指offer题目描述:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。从直观上来看,可以使用一个O(N2)O(N^2)O(N2)的算法:顺序扫描整个数组,每扫描到一个数字时,逐个比较它与它后面数字的大小,从而获得逆序对数。剑指offer上介绍了一种O(NlogN)O(NlogN)O(NlogN)的方法...原创 2019-07-16 20:52:40 · 346 阅读 · 0 评论 -
编辑距离系列题
编辑距离的概念此处不再概述,下面开始说和编辑距离相关的一系列题目,主要包括:普通的编辑距离要求记录操作各操作的数目只有删除操作的编辑距离不同操作代价不同的编辑距离1.编辑距离思路:使用动态规划,dp[i][j]表示word1[0...i]变成word2[0...j]的最短距离,举个栗子,假设word1=horse,word2=ros,构造以下dp矩阵。’ ’...原创 2019-07-15 21:06:03 · 305 阅读 · 0 评论 -
最长公共子序列
题目:最长公共子序列(子串) ---- LCS解法:动态规划思路:设dp[i][j]为以第一个字符串的前i个,第二个字符串的前j个字符构成的最长公共子串,设这两个字符串分别为A和B,则当A[i]==B[j]时,dp[i][j]=dp[i-1][j-1]+1;若A[i]!=B[j],则dp[i][j]=max(dp[i-1][j],dp[i][j-1])代码def LCS(A,B): ...原创 2019-07-10 10:21:05 · 1260 阅读 · 0 评论 -
正则表达式匹配
这道题是leetcode第10题,原题如下:此处记录下此题的解法,同时,新增一个匹配项+,在正则表达式中,+的匹配规则为:‘+’: 匹配单个或任意多个前面的那一个元素'.'的匹配首先,最简单的是.的匹配,对于点来说,它匹配任意单个字符,即如果模式串中的字符是.,那么它可以匹配任意字符;若模式串中的字符是ch,那么它只能匹配字符串中对应的ch。代码如下:def isMatch(tex...原创 2019-08-31 17:05:08 · 460 阅读 · 0 评论