![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
fuzzy__H
这个作者很懒,什么都没留下…
展开
-
摩尔投票算法
摩尔投票算法认定的事实每次从序列里选择两个不相同的数字相抵消,最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。上面就是摩尔投票算法认定的事实。基于以上事实,编写摩尔投票算法代码。思路对于一个序列,先维护一个默认主要元素major(可为任意值)和一个主要元素计数count(初始化为0)。遍历这个序列:如果count为0,则说明还没有找到主要元素,则可把当前元素当作主要元素,同时count累加1,if(count == 0){ major = nums[i]; co原创 2021-07-12 16:32:52 · 182 阅读 · 0 评论 -
合并二叉树(Python版)
题目描述给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。解题思路二叉树-递归解决采用先序遍历,同时遍历两棵树,若有一个为空则返回另一个,否则将两个节点的值相加,可在其中一棵树上操作,最后返回这棵树的根节点。代码实现# Definition for a binary tree node.# class原创 2020-09-21 15:37:59 · 902 阅读 · 0 评论 -
二叉树中的最大路径和-递归实现(Python版)
题目描述给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例1:示例2:解题思路遇到二叉树的题,如果能用递归就尽量递归吧。首先回顾递归三步骤:1、递归终止条件及返回值2、递推条件3、返回值分析处理具体到这道题,采用递归的三个步骤具体化为:1、递归终止条件为节点为空,返回值为02、递推条件:分别递归左右子树,计算左右子树的节点和记为l和r3、返回值及分析:max(0, l, r)原创 2020-07-28 11:06:36 · 647 阅读 · 0 评论 -
将有序链表转换为二叉搜索树(Python版)
题目描述给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。解题思路这道题和“将有序列表转换为二叉搜索树”思路是一样的。在题目“将有序列表转换为二叉搜索树”中,我们利用列表的索引,可以方便地找到列表的中点(当列表长度为偶数时,此处默认后一个为中点),并利用列表的切片索引,递归的构建搜索二叉树的左右子树(中点左边的作为左子树的列表输入,中点右边的列表作为右子树的列表输入),代码1 中将给出原创 2020-07-27 15:32:24 · 432 阅读 · 0 评论 -
二叉树最近公共祖先(Python版)
题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]说明:所有节点的值都是唯一的。p、q 为不同节点且均存在于给定的二叉树中。解题思路具体思路:使用递归,时间复杂度O(n)。1、递归终止条件原创 2020-07-23 16:03:38 · 900 阅读 · 0 评论 -
二叉树的最小深度(Python版)
题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。解题思路这里需要注意的是,当一棵树只有一个叶子节点的时候,其最小深度为2,这种情况需要特殊考虑一下。用递归实现本题。代码实现class Solution: def minDepth(self, root: TreeNode) -> int: if not root: return 0 l_h原创 2020-07-21 23:03:11 · 455 阅读 · 0 评论 -
不同的二叉搜索树(Python版)
题目描述给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。解题思路首先要明确二叉搜索树的重要性质二叉搜索性即一棵二叉搜索树的根节点的值大于左子树所有节点的值,小于右子树所有节点的值,且左子树和右子树也同样为二叉搜索树。假设当前序列长度为 nn,如果我们枚举根节点的值为 ii,那么根据二叉搜索树的性质我们可以知道左子树的节点值的集合为 [1…i−1],右子树的节点值的集合为 [i+1…n]。而左子树和右子树的生成相较于原问题是一个序列长度缩小的子问题,因此我们可以想到用递归的方法来原创 2020-07-21 15:50:59 · 242 阅读 · 0 评论 -
二叉树的序列化与反序列化(Python版)
题目描述请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。解题思路深度优先遍历1、序列化的过程可以采用深度优先遍历方法,此处采用先序遍历2、对于将一棵二叉树的先序遍历结果(采用列表存储),第一个元素为二叉树的根节点,剩余元素可以看成由根节点的左右子树构成,而每一棵子树又是一棵二叉树。3、对于2中的描述,故可以采用递归的方法,由一棵二叉树的先序遍历结果来还原一棵树(由于序列化过程中会将叶子节点的空指针保存,故可以还原)。原创 2020-07-21 15:24:52 · 1195 阅读 · 0 评论 -
ACWing 88.树中两个节点的最低公共祖先(Python版)
题目描述给出一个二叉树,输入两个树节点,求它们的最低公共祖先。一个树节点的祖先节点包括它本身。注意:输入的二叉树不为空;输入的两个节点一定不为空,且是二叉树中的节点;样例:解题思路见注释代码实现class Solution(object): def lowestCommonAncestor(self, root, p, q): """ :type root: TreeNode :type p: TreeNode :原创 2020-07-03 11:12:35 · 380 阅读 · 0 评论 -
AcWing 85.不用加减乘除做加法(奇葩Python版)
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ 四则运算符号。解题思路设两数的二进制形式为a, b,则两数之和S = 非进位和 + 进位,同时非进位和与异或运算规律相同,进位与与运算规律相同(需左移一位)。设n = a异或b, c = a&b<<1,循环求n和c,直至进位c = 0,此时和S = n,返回n即可。知道上述规律之后,代码写起来似乎很简单,但如果你用Python写的话,就会遇到一个很奇葩的问题:在C、C++、Java中负数都是以补码形式存储原创 2020-07-01 23:13:21 · 189 阅读 · 0 评论 -
AcWing 83.股票的最大利润(Python版)
题目描述假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖 一次 该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为[9, 11, 8, 5, 7, 12, 16, 14]。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。样例:解题思路1、首先想到暴力法每一个元素都当做最低价,往后遍历找到最高差价,时间复杂度O(n^2),LeetCode上无法通过2、一次遍历法用一个变量记录遍历过的元素中的最低价,寻找当前价与最低价之间的最高差价:即在遍历过原创 2020-07-01 11:32:49 · 268 阅读 · 0 评论 -
LeetCode67.二进制求和(Python版竖式相加思路)
题目描述给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。示例 1:提示:每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。1 <= a.length, b.length <= 10^4字符串如果不是 “0” ,就都不含前导零。解题思路首先想到的是用竖式相加,但需要处理一个问题就是竖式相加时是低位对齐,而字符串索引是从高位开始索引的,故需要先将字符串翻转,再对短的字符串进行补零(这样在索引时不会越界);翻转后对位相加,再将最后的结果原创 2020-06-23 22:03:20 · 337 阅读 · 0 评论 -
AcWing 79.滑动窗口的最大值(Python版)
题目描述给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组[2, 3, 4, 2, 6, 2, 5, 1]及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为[4, 4, 6, 6, 6, 5]。数据保证k大于0,且k小于等于数组长度。解题思路1、如果k等于nums数组的长度,则返回nums中最大值2、如果小于nums数组长度,则可以先遍历前k个元素,找出最大的值的下标记作max_ind,再利用两个指针,头指针指向第k个元素,尾指针指向第2个元素,然后让两原创 2020-06-17 21:41:14 · 240 阅读 · 0 评论 -
LeetCode 76.最小覆盖子串(滑动窗口解法Python版)
题目描述给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。解题思路LeetCode 上已经有很多大神写解题思路了,我也是看大神的思路写的。此处记录我自己的理解过程。滑动窗口是双指针的高级技巧,首先得定义两个指针,left和right,在窗口[left, right]中寻找符合题意的解,如何寻找这样的解即滑动窗口的核心思想。就题解题:1、首先定义两个字典window和need,need记录T,window记录窗口中的字符出现次数2、首先让右指针不断向右原创 2020-06-09 16:53:04 · 319 阅读 · 0 评论 -
ACWing 73.数组中只出现一次的两个数
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。你可以假设这两个数字一定存在。样例:思路1首先想到的是使用哈希表,统计每个数字出现的频数,最后再遍历哈希表,找出只出现一次的数字。这样的时间复杂度为O(n),空间复杂度为O(n)。问题解决。实现代码如下:思路1代码class Solution(object): def findNumsAppearOnce(self, nums): """ :type原创 2020-06-05 15:23:16 · 118 阅读 · 0 评论 -
AcWing 75. 和为S的两个数字(Python版)
题目描述输入一个数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。你可以认为每组输入中都至少含有一组满足条件的输出。样例:思路1对于在数组中找两数之和的题目,首先想到的是用哈希表,(暴力搜索法时间复杂度为n^2,不考虑),哈希表的查询时间为 O(1),算法的时间复杂度降低到 O(N),但是需要 O(N) 的空间复杂度来存储哈希表。首先给出哈希表的解法代码哈希表实现class Solution(object): def findN原创 2020-06-04 22:45:57 · 161 阅读 · 0 评论 -
AcWing 72.平衡二叉树(Python版)
题目描述输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。注意:规定空树也是一棵平衡二叉树。样例:解题思路对于平衡二叉树,其每一个节点的左右子树的深度相差不超过1,所以需要做两件事:1、遍历每一个节点2、求出每个节点左右子树的深度差对于1,应该用递归对树的节点进行遍历;对于2,因为之前做过一道求二叉树的深度的题,所以直接拿来用。实现代码如下:代码实现class Solution(object):原创 2020-06-03 23:31:58 · 192 阅读 · 0 评论 -
AcWing 55.连续子数组的最大和(Python版)
题目描述输入一个 非空 整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。样例:解题思路Kadane算法Kadane全名叫Joseph “Jay” Born Kadane,是卡耐基梅隆大学的统计学方面的教授,于1984年提出提出了线性解决这个问题的办法。该算法的核心思路是判断以前一个元素结尾的子序列的最大值能不能给当前元素结尾的序列提供增益。就比如例子中的子序列[1, -2, 3],在判断3这个元素是否应原创 2020-06-02 11:07:43 · 181 阅读 · 0 评论 -
AcWing 49.二叉搜索树与双向链表(Python版)
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。注意:需要返回双向链表最左侧的节点。例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。思路对于一棵二叉搜索树,其中序遍历结果为升序的有序结果,以例中的二叉搜索树为例,其中序遍历结果为[4,6,8,10,12,14,16]。由于题中要求不能创建新的结点,且只能调整树中结点指针的指向,故可以将树的节点按照中序遍历的顺序记录在列表中,再遍历该列表,将当前节点的右原创 2020-05-29 15:28:03 · 195 阅读 · 1 评论 -
ACWing 47.二叉树中和为某一值路径(Python版)
题目描述输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。样例解题思路回溯算法:def recur(): 做出选择 recur() 撤销选择代码实现class Solution(object): def findPath(self, root, sum): """ :type root: TreeNode :type sum: int原创 2020-05-29 09:41:05 · 176 阅读 · 0 评论 -
AcWing 46.二叉搜索树的后序遍历(Python版)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。样例:输入:[4,8,6,12,16,14,10]输出:True思路关于二叉搜索树及后序遍历的一些性质:1、在搜索二叉树中,小于父节点的键都在左子树中,大于父节点的键都在右子树中(二叉搜索性)。也即是说,对于任意一棵二叉搜索树,任意左子树的节点值都小于根节点的值,任意右子树的节点值都大于根节点的值。2、二叉搜索树的子树仍为二叉搜索树,具原创 2020-05-28 14:52:19 · 136 阅读 · 0 评论 -
AcWing 44.从上到下分行打印二叉树(Python版)
题目描述从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。样例思路首先要想到这是二叉树的层次遍历(也称为广度优先遍历BFS)。利用队列可以实现二叉树的层次遍历,而此题是需要按层输出遍历结果,故需要记录每层的遍历结果。直接上代码。代码实现# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x#原创 2020-05-27 21:49:59 · 151 阅读 · 0 评论 -
ACWing 40.顺时针打印矩阵(python版)
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。样例:思路按照顺时针方向,在矩阵中可以拆分为右->下->左->上四个步骤,因此将分为四个状态进行遍历:1、右:从左往右,遍历完成后上边界+1;2、下:从上往下,遍历完成后右边界-1;3、左:从右往左,遍历完成后下边界+1;4、上:从下往上,遍历完成后左边界+1;5、可利用一个计数器完成遍历终止条件,即每打印一个元素,计数器+1,直到计数器等于matrix中的元素个数,退出循环,遍历终止。代码实现c原创 2020-05-27 11:28:07 · 192 阅读 · 0 评论 -
AcWing 39.对称的二叉树(python版)
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。样例思路对于一棵对称的二叉树,需要判断其根节点的左右两棵子树是否为镜像,1、左子树的根节点与右子树的根节点值相等2、左子树根节点的左孩子与右子树根节点的右孩子互为镜像,左子树根节点的右孩子与右子树根节点的左孩子互为镜像。因此,需要遍历子树的所有节点,故可采用递归思想来解出此题。代码实现# Definition for a binary tree node.# class TreeNo原创 2020-05-27 09:32:46 · 152 阅读 · 0 评论 -
ACWing 38.二叉树镜像(python版)
题目描述输入一个二叉树,将它变换为它的镜像。样例:思路观察后可发现,镜像后的二叉树就是把所有节点的左右儿子交换。具体实现步骤如下:1、用递归的方法遍历二叉树的节点,非叶子节点交换该节点的左右儿子2、遇到叶子节点则返回代码实现# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left原创 2020-05-26 22:11:58 · 152 阅读 · 0 评论 -
AcWing 37.树的子结构(python版)
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。我们规定空树不是任何树的子结构。样例树A:树B:返回 true ,因为B是A的子结构。思路1、由于对于一棵树的描述是给出其根节点,所以判断一棵树是否为另外一棵树的子树,首先就是判断两树的根节点是否一致。在对比过程中,如果发现A树的根节点和B树的根节点不一致,则需要找到A根节点的子孙节点接着与B的根节点进行比较,这里就想到利用递归遍历一棵树的所有节点。这里需要遍历的是A的所有节点2、对于找到根节点相同的情况,则需要判断两棵树是否有相同原创 2020-05-26 10:59:50 · 205 阅读 · 0 评论 -
AcWing 34. 链表中环的入口结点(python版)
题目描述给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。给定如上所示的链表:[1, 2, 3, 4, 5, 6]2注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。则输出环的入口节点3.思路1、判断是否存在环快指针一次走两步,慢指针一次走一步若存在环,则两指针必会相遇2、存在环后让慢指针回到起点由于快指针比慢指针多走了k步,而这k步正好是环的长度,设相遇点距环的起点的距离为 m,那么环的起点距头结点 he原创 2020-05-25 16:11:25 · 962 阅读 · 0 评论 -
AcWing 32.调整数组顺序使奇数位于偶数前面(python版)
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序。使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。样例输入:[1,2,3,4,5]输出: [1,3,5,2,4]思路思路1:遍历数组,将偶数入栈后删除该偶数,最后返回栈和删除后的数组。思路2:使用两个指针,从最左和最右开始往中间靠,如果左指针一直指向奇数则一直往右走,如果右指针一直指向偶数则一直往左走,否则交换两个指针的数值,终止条件为左指针小于右指针。代码实现# 思路1代码,本地IDE调试没问题,在ACW原创 2020-05-25 13:39:03 · 286 阅读 · 0 评论 -
AcWing 30.正则表达式匹配(python版)
题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。样例输入:s=“aa”p=“a*”输出:true思路这是道难度系数为困难的题,一开始自己是没有思路的,后面参考了LeetCode上一位大神写的题解,跟随着他的思路写下来了,代码部分也参考了他的。附转载 2020-05-25 11:45:59 · 170 阅读 · 0 评论 -
AcWing 29.删除链表中的重复元素(python版)
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。样例1输入:1->2->3->3->4->4->5输出:1->2->5样例2输入:1->1->1->2->3输出:2->3思路这道题的关键在与链表的边界问题处理,因而采用两个指针pre和cur进行遍历,在遍历之前先增加一个哑结点dummy指向链表的头。1、初始化指针:pre指针指向哑结点,cur指针指向链表的头结点。2原创 2020-05-24 13:04:11 · 315 阅读 · 0 评论 -
AC Wing 26.二进制中1的个数(python版)
题目描述输入一个32位整数,输出该数二进制表示中1的个数。注意:负数在计算机中用其绝对值的补码来表示。样例1输入:9输出:2解释:9的二进制表示是1001,一共有2个1。样例2输入:-2输出:31解释:-2在计算机里会被表示成11111111111111111111111111111110,一共有31个1。思路对于正数来说,通过除2取余的方法即可得到其二进制表示;对于负数来说,其补码等于2的32次方减去负数绝对值的二进制表示,也即可将求负数的二进制补码表示转换为求(2^32 +原创 2020-05-21 17:08:48 · 236 阅读 · 0 评论 -
AC Wing 25.剪绳子(python版)
题目描述给你一根长度为 n 绳子,请把绳子剪成 m 段(m、n 都是整数,2≤n≤58 并且 m≥2)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1] … k[m] 可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。样例输入:8输出:18思路贪婪算法:当n大于等于5时,我们尽可能多的剪长度为3的绳子;当剩下的绳子长度为4时,把绳子剪成两段长度为2的绳子。 为什么选2,3为最小的子问题?因为2,3包含于各个原创 2020-05-21 15:05:29 · 360 阅读 · 0 评论 -
ACWing 21.斐波那契数列(Python版)
题目描述输入一个整数 n ,求斐波那契数列的第 n 项。假定从0开始,第0项为0。(n<=39)样例输入整数 n=5返回 5思路F(n) = F(n-1)+F(n-2) n>2若采用直接递归,则会超出运行时间。优化方法:记住已有的结果(缓存)来优化程序性能。代码实现(Python)class Solution(object): def __init__(self): self.__result = [-1]*40 def Fibonacci原创 2020-05-20 12:55:57 · 265 阅读 · 0 评论 -
AC Wing:19.二叉树的下一个节点(python版)
题目描述给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。注意:如果给定的节点是中序遍历序列的最后一个,则返回空节点;二叉树一定不为空,且给定的节点一定不是空节点;样例:假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。则应返回值等于3的节点。思路分三种情况讨论:给定节点有右子树,则其下一个节点为该节点右子树的最左孩子节点给定节点无右子树,且给定节点为左孩子节点,则其下一个节点为该节点的父亲节点给定节点无右子原创 2020-05-20 09:53:09 · 465 阅读 · 0 评论