
算法专栏
以算法题目为主,包括链表、树、字符串、队列、栈、数组、图、动态规划
陆·柒
失败了 别给自己找理由 就是菜而已!
展开
-
python—删除链表中倒数第K个元素
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next# 顺序删除def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: dummy = ListNode(0) dummy.next = head # step1: 获取链表长度 cur原创 2021-02-25 07:10:24 · 443 阅读 · 0 评论 -
python—找出单链表中倒数第K个元素
class LNode(object): def __init__(self, item): self.data = item self.next = Nonedef findLastK(head, k): if head is None or head.next is None: return slow = LNode() fast = LNode() slow = head.next fast = he原创 2021-02-25 07:09:27 · 202 阅读 · 0 评论 -
python—创建单向链表及操作
文章目录概述概述我们将在接下来的章节中介绍更多内容。完成后,你将:了解单链表和双链表的结构;在单链表或双链表中实现遍历、插入和删除;分析在单链表或双链表中的各种操作的复杂度;在链表中使用双指针技巧(快指针慢指针技巧);解决一些经典问题,例如反转链表;分析你设计的算法的复杂度;积累设计和调试的经验。...原创 2021-02-25 06:46:08 · 243 阅读 · 0 评论 -
python—把链表的相邻元素翻转
class ListNode(): def __init__(self, val=0, next=None): self.val = val self.next = nextdef reverse(head): if head is None or head.next is None: return cur = head.next pre = head next = None # 当前节点的后继节点的后继节点原创 2021-02-25 07:11:28 · 175 阅读 · 0 评论 -
python—单链表反转
def reverseList(head): if head is None or head.next is None: return head pre_node = head current_node = head while current_node is not None: next_node = current_node.next # 暂存当前节点的next节点 current_node.next = pre_node # 当前节点的next指向初始化的节点 pre_n原创 2021-02-25 07:02:27 · 141 阅读 · 0 评论 -
python—从单链表中移除重复项
class LNode(object): def __init__(self, item): self.data = item self.next = None# 顺序删除 时间复杂度 o(n**2)def removeDup(head): if head == None or head.next == None: return outerCur = head.next interCur = None int原创 2021-02-25 07:07:43 · 623 阅读 · 0 评论 -
python—判断链表是否有环并找到入环节点
文章目录判断链表是否有环并找到入环节点判断链表是否有环并找到入环节点class LNode: def __init__(self, val): self.val = val self.next = Nonedef exitLoop(head): if not head: return None p1 = p2 = head while p2 and p2.next: p1 = p1.next p2 = p2.next.next if p1原创 2021-04-26 12:31:22 · 277 阅读 · 0 评论 -
python—买卖股票的最佳时机
文章目录题目描述常规的解法动态规划题目描述给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2原创 2020-12-23 09:52:14 · 1710 阅读 · 0 评论 -
python—斐波那契数列
常规的解法def fib(x): if x < 2: return x return fib(x-1) + fib(x-2)使用动态规划的思路相当于函数缓冲,加递归调用,为了避免重复,可以把计算过的值存起来,当再次用到时,可以直接使用,这其实是用空间换时间def fib(x): d = {} for i in range(x + 1): if i < 2: f = i else: f原创 2020-12-22 09:29:19 · 235 阅读 · 0 评论 -
python—爬台阶
爬台阶问题:一次只能爬一阶或者两阶台阶,求爬到n阶有多少种走法。分析:假定n=10,首先考虑最后一步的情况,要么从第九级台阶再走一级到第十级,要么从第八级台阶走两级到第十级,因而,要想到达第十级台阶,最后一步一定是从第八级或者第九级台阶开始.也就是说已知从地面到第八级台阶一共有X种走法,从地面到第九级台阶一共有Y种走法,那么从地面到第十级台阶一共有X+Y种走法.即F(10)=F(9)+F(8)分析到这里,动态规划的三要素出来了.边界:F(1)=1,F(2)=2最优子结构:F(10)的最优原创 2020-12-22 09:43:21 · 1688 阅读 · 0 评论 -
python—打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2.原创 2020-12-25 01:42:54 · 513 阅读 · 2 评论 -
动态规划
动态规划动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了显著的效果源自百度百科动态规划问题的⼀般形式就是求最值。 动态规划其实是原创 2020-12-22 09:11:54 · 433 阅读 · 0 评论 -
python—四种方法求解最大连续子序列和
文章目录穷举法优化穷举分治法动态规划给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大。例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4],连续子序列 [4,-1,2,1] 的和最大,为 6。穷举法最简单的方法就是直接求解出所有的子序列之和,然后比较子序列之和,求出最大值。那么如何求解子序列呢?首先子序列的起始位置可能是任意的,结束位置也可以是任意的。可以一层循环确定子序列的起始位置,嵌套一层循环确定子序列的结束位置并求和,def getMax原创 2020-12-24 09:25:39 · 6488 阅读 · 4 评论 -
字符串篇(python)—字符串里最长的回文字符串
字符串里最长的回文字符串回文字符串:一个字符串从左到右与从右到左遍历得到的序列是相同的例如 abcaba是回文字符串 abcab不是回文字符串abcdefgfedxyz——>defgfed暴力破解法"""下面字串中不是回文字符串用f表示 反则用t表示例如字符串 "babad"1. b a #f b a b #t 3 b a b a #f b a b a d #f2. a b #f a b a #t 3 a b a d #f3. b a #f b a d原创 2020-12-05 10:34:57 · 3647 阅读 · 0 评论 -
字符串篇(python)—两个字符串的最长公共子串
两个字符串的最长公共子串字符串s1=“acffdcg”,s2=“dfsdcgff”,s1和s2的最长公共子串为"dcg"动态规划法def getMaxSubStr(s1, s2): maxL, count = 0, 0 m = [[0 for i in range(len(s2) + 1)] for j in range(len(s1) + 1)] for i in range(len(s1)): for j in range(len(s2)):原创 2020-12-03 09:10:52 · 3622 阅读 · 0 评论 -
字符串篇(python)—两个字符串的最长公共子序列
字符串篇(python)—两个字符串的最长公共子序列给定两个字符串A,B,长度分别为m,n。要求求出他们的最长公共子序列,返回其长度,例如A = “hello word”B = “loop”最长公共子序列为“loo” 长度为3思路动态规划的子问题res[i][j]为截止到字符串A的第i个字符和截止到字符串B的第j个字符的最长公共子序列。由此可以得出递推公式当i=0 or j=0 res[i][j] = 0当A[i] == B[j]时 res[i][j] = res[i-1][j-1]+1原创 2020-12-06 09:42:39 · 5079 阅读 · 5 评论 -
字符串篇(python)——字符串数组中两个字符串的最小距离
题目描述给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。def findMinDistance(strs, str1, str2): if str1 not in strs or str2 not in strs: return -1 index_l1 = [i for i, j in enumerate(strs) if j == str1].原创 2021-04-21 20:46:58 · 638 阅读 · 0 评论 -
字符串(python)——字符串数组中的最长公共前缀
文章目录字符串数组中的最长公共前缀字符串数组中的最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。def findLongestCommonPrefix(strarr): if not strarr原创 2021-04-28 17:33:04 · 1293 阅读 · 0 评论 -
字符串篇(python)—消除字符串中嵌套的括号
消除字符串中嵌套的括号给定一个如下格式的字符串,(1,(2,3),(4,(5,6),7)) 括号内的元素可以是数字 也可以是另外一个括号实现一个算法消除嵌套括号 例如变成(1,2,3,4,5,6,7) 如果表达式有误 就报错def removeNestedOare(strs): if strs == None: return strs num = 0 if list(strs)[0] != '(' or list(strs)[-1] != ')': return None sb =原创 2020-12-04 09:22:44 · 4703 阅读 · 2 评论 -
字符串篇(python)—如何判断字符串是否包含重复字符
如何判断字符串是否包含重复字符一种以时间换空间的方法"""判断一个字符串是否重复字符 例如:good就包含重复字符 而abc就不包含重复字符串"""def isDup(strs): lens = len(strs) i = 0 while i < lens: j = i + 1 while j < lens: if list(strs)[j] == list(strs)[i]:原创 2020-12-08 08:41:02 · 10663 阅读 · 4 评论 -
字符串篇(python)—如何找到由其他单词组成的最长单词
如何找到由其他单词组成的最长单词给定一个字符串数组 找出数组中最长的字符串 使其能由数组中其他的字符串组成例如给定字符串数组 [“test”,“tester”,“testertest”,“testing”,“apple”,“seattle”,“banana”,“batting”,“ngcat”,“batti”,“bat”,“testingtester”,“testbattingcat”]满足要求的字符串 testbattingcat 组成的字符串 test batti ngcatclass L原创 2020-12-09 08:51:56 · 3864 阅读 · 0 评论 -
一次性让你彻底明白Manacher算法(马拉车)—解决最长回文字符串问题
马拉车算法中心扩展法Manacher算法中心扩展法判断一个字符串是否为回文字符串最简单的方法:从字符串最中间的字符开始向两边扩展,通过比较左右两边是否相等就可以确定这个字符串是否为回文字符串。这种方法对于字符串长度为奇数和偶数的情况需要分情况讨论。思路对于字符串中的每一个字符串Ci,向两边扩展,找出以这个字符串为中心的回文字符串的长度,以Ci为中心向两边扩展以Ci和Ci+1为中心向两边扩展class Test(): def __init__(self): self原创 2020-12-13 22:17:54 · 1540 阅读 · 0 评论 -
字符串篇(python)—如何统计字符串中连续的重复字符个数
"""递归实现一个求字符串中连续出现相同字符的最大值例如 字符串 "aaabbcc" 最大值为a 3解题思路遍历字符串的时候定义两个变量 curMaxLen记录当前遍历字符重复的连续字符个数maxLen遍历到目前为止找到最长的连续重复字符的个数"""def getMaxDupChar(s, startIndex, curMaxLen, maxLen): if startIndex == len(s) - 1: return max(curMaxLen, maxLen原创 2020-12-10 09:22:30 · 10114 阅读 · 0 评论 -
字符串篇(python)—按照给定的字母序列对单词数组排序
按照给定的字母序列对单词数组排序字母序列 [d,g,e,c,f,b,o,a]实现一个方法 要求对方输入一组字符串 input= [‘bed’,‘dog’,‘dear’,‘eye’] 按照字母顺序排序并打印 dear dog eye bed# 主要的思路给定的字母序列建立一个可以进行大小比较的序列 采用map数据结构实现map的键为给定的字母序列 值为依次递增的正整数对于没有在字母序列中的字母,对应的键按-1处理# 根据char_to_int规定的字符的大小关系比较两个字符的大小de原创 2020-12-06 09:51:07 · 4135 阅读 · 0 评论 -
树面试题总结
文章目录树的几个概念二叉树概念存储方式操作平衡二叉树(AVL)红黑树B树B+树常见面试题二叉树的三种遍历方式二叉树的最大深度二叉树的层次遍历有序数组转化为二叉树判断是否为对称二叉树树的几个概念由一个或一个以上的节点组成,存在一个特殊的节点,成为树根。其中的每一个子集合本身也是一种树形结构,即此根节点的子树。几个关于树的专有名词度数:每个节点所有子树的个数层数:树的层数高度:树的最大层数树叶或终端节点:度数为零的节点就是树叶。父节点:每一个节点都有连接的上一层节点。子节点:每一个节点都有连原创 2021-03-09 08:34:45 · 464 阅读 · 0 评论 -
排序篇(python)—冒泡排序
冒泡排序算法描述代码实现注意冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。算法描述比较相邻的元素,如果第一个比第二个大,就交换它们两个对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;针对所有的元素重复以上的步骤,除了最后一个;重复步骤1~3,直原创 2020-12-12 01:08:25 · 1270 阅读 · 1 评论 -
排序篇(python)—归并排序
归并排序描述代码归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。描述把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列。代码def mergeSort(arr): lens = len(arr)原创 2020-12-15 22:17:11 · 599 阅读 · 0 评论 -
排序篇(python)—快速排序
快速排序描述代码快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。描述从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;递归地(recursive)把小于基准值元素的子数列和大于基准值元原创 2020-12-17 23:22:32 · 373 阅读 · 0 评论 -
排序篇(python)—希尔排序
希尔排序描述代码实现1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。描述先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;按增量序列个数k,对序列进行k 趟排序;每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整原创 2020-12-14 21:17:03 · 774 阅读 · 0 评论 -
排序篇(python)—堆排序
堆排序描述代码堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。描述将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R原创 2020-12-16 21:53:57 · 438 阅读 · 0 评论 -
排序篇(python)—选择排序
选择排序算法描述代码实现算法分析选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。算法描述n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:初始状态:无序区为R[1…n],有序区为空;第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1原创 2020-12-12 08:00:48 · 1227 阅读 · 0 评论 -
排序篇(python)—插入排序
插入排序插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到下一位置;重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;将新元素插入到该位置后;重复步骤2原创 2020-12-13 20:51:42 · 1294 阅读 · 0 评论 -
排序算法总结
常用排序算法总结排序算法大体可分为两种:一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。排序算法比较这是比较排序算法的总结也可以参考这张图...原创 2020-12-12 00:43:20 · 1089 阅读 · 0 评论 -
常用的查找方法:顺序查找、二分查找法等
文章目录顺序查找二分查找法插值查找法根据数据量的大小 可将查找分为内部查找和外部查找内部查找:数据量较小的文件可以一次性全部加载到内存中进行查找外部查找:数据量较大的文件无法一次性加载到内存中处理,需要使用辅助存储器来分次处理注意:我们根据在查找过程中查找的文件是否改动,将查找分为静态查找和动态查找顺序查找顺序查找是一种线性查找,最简单的查找方式。逐个遍历,最坏的情况下,时间复杂度为O(n)示例代码def orderSearch(num): import random cou原创 2021-01-04 21:14:14 · 1502 阅读 · 1 评论 -
拉勾网教育课程之《数据结构与算法面试宝典》
数据结构之一题多解栈栈的特性与使用特点: 先进后出案例1判断字符串括号是否合法字符串中只有字符“(”和“)”。合法字符串需要括号可以配对。比如:输入:"()" 输出:true解释:() ()() (())都是合法的实现一个函数,来判断给定的字符串是否合法解题思路模拟 模拟题目的运行 字符串 "()()(())"规律 尝试总结出题目的一般规律和特点 每个左括号"("或者右括号")"都要完成配对 才是合法的 配对可通过消除法来消除合法的括号,如果原创 2021-03-21 00:05:46 · 796 阅读 · 1 评论 -
python—求范围以内的素数(质数)
这道题目之前面试zjtd的时候问过,很简单素数:一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数话不多说,直接上代码def getPrime(x): res = [] if x <= 1: return for i in range(2,x+1): for j in range(2, i): if i % j == 0: break else: res.appen原创 2020-12-21 11:12:48 · 2631 阅读 · 0 评论 -
python—最大公约数和最小公倍数
最大公约数def hcf(x, y): if x <= 0 or y <= 0: return res = 0 if x > y: small = y else: small = x for i in range(1,small+1): if x % i ==0 and y % i == 0: res = iif __name__ == '__main__': print(hcf(12,24)) # 内置模块import mathmath.原创 2020-12-21 10:59:09 · 1252 阅读 · 0 评论