
算法与数据结构
文章平均质量分 80
FLOWVERSE
科技、哲学、与心理
展开
-
数据结构与算法: 递归范式
在算法中,递归是一种解决问题的常见方法,即通过在函数内调用自身来解决问题。原创 2023-03-05 23:37:32 · 334 阅读 · 0 评论 -
手撕算法:数组
确定区间是左闭右闭还是左闭右开,这决定了之后进行while循环的时候如何选择区间;暴力解法就是直接平方然后再排序,如果用快排的话,时间复杂度就是。并没有真正意义的删除,而只是元素的覆盖而已;这里记录一个时间复杂度为。...原创 2022-08-28 23:33:59 · 152 阅读 · 0 评论 -
master定理笔记(手绘导图)
概述学习master定理的起因是遇到的以下笔试题,虽然说看到有些网友说无法用master定理做…以下将简要介绍master的理论知识、重点与例题。整体导图逻辑为:master定理概念使用方法及例题预备小知识(Θ,O与Ω)方法及例题...原创 2020-06-02 16:38:34 · 583 阅读 · 0 评论 -
算法与数据结构 --- 分割数组
题目leetcode 915. 分割数组分析需要左边的所有元素都小于等于右边的每个元素。原创 2021-05-14 21:46:34 · 384 阅读 · 0 评论 -
剑指offer13 --- 包含min函数的栈
剑指offer13 — 包含min函数的栈题目定义栈的数据结构,请再该类型中实现一个能够得到栈中所含最小元素的min函数,且满足时间复杂度为O(1)分析用时间换空间,或者用空间换时间。为实现时间复杂度O(1),考虑用空间换时间,在该题中即新建一个minValue列表,stack中每pop进一个数值则和minValue[-1]进行一次比较即可知道stack中的最小值,即实现时间复杂度为O(1...原创 2020-05-06 19:50:44 · 104 阅读 · 0 评论 -
剑指offer24 --- 链表中环的入口结点
剑指offer24 — 链表中环的入口结点题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。分析什么是环?判断是否有环的想法1:空间换时间走一个加一个到set里面,有重复就说明是环。快慢指针:先判断是否有环(判断是否有环的想法2): 快指针走到none,则没环。 快指针和慢指针相遇,则有环。快走2慢走1时,快慢必相遇,相遇时经推导有:开头至环入口的距离s = 相遇点至环入口距离m + (n-1)*(相遇点至环入口距离m+环入口至相原创 2020-05-09 21:23:58 · 206 阅读 · 0 评论 -
二叉树的深度遍历
二叉树的深度遍历递归以及非递归的方式对二叉树进行深度遍历。非递归的方法常考。class TreeNode(object): def __init__(self,x): self.val = x self.left = None self.right = Nonedef preOrderRecursive(root): if root == None: return None print(root.val)原创 2020-05-12 18:04:17 · 162 阅读 · 0 评论 -
二维数组中的查找
二维数组中的查找题干在一个二维数组中,每一行从左到右数值递增,每一列从上到下数值递增,请完成一个函数,输入一个这样的二维数组和一个整数,判断数组中是否含有该整数思路充分利用题干中二维数组给定的条件,即递增,进而降低时间复杂度。将target和行[i]的最后一个数进行比较,如果target比较小,那么应该在该行的左边进行查找,即j-=1如果target值比较大,那么应该先和下一行的最后一...原创 2020-05-06 13:07:52 · 136 阅读 · 0 评论 -
算法与数据结构:几何/数学相关笔记
问题:答案及解析原创 2020-06-02 17:04:37 · 806 阅读 · 0 评论 -
剑指offer26 --- 数组中出现次数超过一半的数字
剑指offer26 — 数组中出现次数超过一半的数字题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析 & 解dict方法:# -*- coding:utf-8 -*-class Solution: def MoreThanHalfNum_Solution(self, numbers): # w原创 2020-05-11 21:19:54 · 142 阅读 · 0 评论 -
剑指offer48 --- 连续子数组的最大和
剑指offer48 — 连续子数组的最大和题目HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)。分析先从头开始连原创 2020-05-28 16:53:35 · 174 阅读 · 0 评论 -
剑指offer53 --- 矩形覆盖
剑指offer53 — 矩形覆盖题目我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:分析实质上是斐波那契数列的思想。第一个填满,即竖着放的时候,还剩下f(n-1)种放法。第一个横着放的时候,即两个横着放的时候,还剩下f(n-1)种放法。因此,有f(n)=f(n-1)+f(n-2),那么也就需要知道n=1以及n=2时候有几种放法,当n=1时,只有一种放法,n=2时,有两种方原创 2020-05-28 17:29:12 · 153 阅读 · 0 评论 -
剑指offer22 --- 两个链表的第一个公共结点
剑指offer22 — 两个链表的第一个公共结点题目输入两个链表,找出他们的第一个公共结点。分析绿框内为待求的公共结点。没有公共的返回None即可。两个链表的头都往后走,短的先到None停住,然后计算二者之间差的步数。之后让长的先走k步,之后长短一起走,相等时返回短的即可。解# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.ne原创 2020-05-08 20:17:18 · 175 阅读 · 0 评论 -
剑指offer46 --- 二叉搜索树的第k个结点
剑指offer46 — 二叉搜索树的第k个结点题目给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。分析由于二叉搜索树的特殊性,中序遍历第k个结点即为从小到大的第k个数据。即写一个中序遍历的函数,调用并利用一个辅助数组进行遍历结果存储即可。代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.v原创 2020-05-27 02:36:23 · 157 阅读 · 0 评论 -
算法与数据结构---二叉树相关问题
leetcode 654 最大二叉树原创 2021-03-15 15:44:58 · 332 阅读 · 0 评论 -
剑指offer32 --- 树的子结构(Python)
剑指offer32 — 树的子结构(Python)题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)分析先判断root的情况(判断root的情况时也是先判断root,再判断左右子树是否一致(递归)), 再判断左右子树(递归)。具体见代码。解# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.原创 2020-05-14 21:07:48 · 184 阅读 · 0 评论 -
剑指offer14 --- 栈的压入弹出序列
剑指offer14 — 栈的压入弹出序列题目输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否可能成为该栈的弹出序列。假设压入栈的所有数字均不相等,例如序列1,2,3,4,5是某栈的压入序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该栈序列的弹出序列。分析新建一个列表,先逐个压入pushV中的元素,并逐个判断下一个是压入还是弹出。...原创 2020-05-06 20:40:26 · 186 阅读 · 0 评论 -
剑指offer43 --- 对称的二叉树
剑指offer43 — 对称的二叉树题目请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析用递归来判断是否为对称的二叉树,左的左是不是等于右的右,左的右是不是等于右的左,答案都是yes的时候,就是一颗对称的二叉树。代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.原创 2020-05-22 16:02:58 · 150 阅读 · 0 评论 -
剑指offer44 --- 按之字形打印二叉树
剑指offer44 — 按之字形打印二叉树题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。分析利用两个栈来实现。当栈1和栈2都是空的时候就退出循环。代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None#原创 2020-05-23 00:07:20 · 167 阅读 · 0 评论 -
剑指offer31 --- 重建二叉树
剑指offer31 — 重建二叉树题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序描述遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析手动重建流程图:算法步骤图:代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val =原创 2020-05-14 20:20:07 · 138 阅读 · 0 评论 -
剑指offer15,16 --- 链表概念&从尾到头打印链表
剑指offer15,16 — 链表概念&从尾到头打印链表链表概念链表长度可变。单链表循环链表:双链表:双链表可以很方便的找上一个结点的数据题目输入一个链表,按链表值从尾到头的顺序返回一个ArrayList.分析链表每一个结点的结构:class ListNode: def __init__(self,x): self.val...原创 2020-05-07 11:52:12 · 153 阅读 · 0 评论 -
剑指offer41 --- 二叉树的下一个结点
剑指offer41 — 二叉树的下一个结点题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。分析中序遍历即为左中右的顺序。将结点分为两种情况,有右子树的情况以及没有右子树的情况。寻找右子树,如果存在就一直找到右子树的左子树,就是输出的下一个结点没有右子树,就寻找他的父节点,一直找到它是父节点的左子树的时候,打印该左子树结点。代码# -*- coding:utf-8 -*-# class Tree原创 2020-05-22 15:39:56 · 197 阅读 · 0 评论 -
算法与数据结构--- 序列化以及反序列化二叉树(Python及C++实现)
序列化二叉树题目请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然原创 2020-05-28 15:20:19 · 421 阅读 · 0 评论 -
算法与数据结构:丑数
剑指offer28 — 丑数题目把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。分析新建一个list,用来存储丑数。利用三个指针来不重复的,有序的构建丑数列表。解# -*- coding:utf-8 -*-class Solution: def GetUglyNumber_Solution(self, index): # write c原创 2020-05-12 13:34:44 · 196 阅读 · 0 评论 -
剑指offer21 --- 复杂链表的复制
复杂链表的复制题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)分析解法1:deepcopy可以但是copy不行.import copydef Clone(self,pHead) ret = copy.deepcopy(pHead) return ret解法2:用链表实现。每一次都要原创 2020-05-08 19:27:19 · 200 阅读 · 0 评论 -
剑指offer29 --- 数组中只出现一次的数字
剑指offer29 — 数组中只出现一次的数字题目一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。分析解# -*- coding:utf-8 -*-class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def FindNumsAppearOnce(self, array): # write code here if len(array) <2:原创 2020-05-12 15:00:33 · 143 阅读 · 0 评论 -
剑指offer --- 替换空格
替换空格题目请实现一个函数,将一个字符串中的每个空格替换成"%20"。例如,当字符串为We Are Happy时,经过替换后的字符串为We%20Are%20Happy思路如果用python的话,直接return s.replace(' ','%20'),假设没有replace这个函数,自己实现:空格是一位,但是%20是三位,如何解决?这个即为考点,不能每更改一次,后面就挪一次,因此不...原创 2020-05-06 14:02:53 · 168 阅读 · 0 评论 -
剑指offer11 --- 调整数组顺序使奇数位于偶数前面
剑指offer11 — 调整数组顺序使奇数位于偶数前面题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数之间,偶数和偶数之间的相对位置不变。解class Solution: # 时间复杂度O(n),空间复杂度O(n)(新增加了n个数) def reOrderArray(self,arr...原创 2020-05-06 19:11:46 · 120 阅读 · 0 评论 -
剑指offer --- 用两个栈实现队列
剑指offer08 — 用两个栈实现队列题目用两个栈来实现一个队列,完成队列的push和pop操作,队列中的元素为int类型思路栈是先进后出,后进先出;队列是先进先出;即如何利用两个栈实现先进先出的效果,可用一个栈来接收数据,接收完数据导到第二个栈去输出即可。解pythonclass Solution: def __init__(self): # 定义两个栈...原创 2020-05-06 15:02:26 · 136 阅读 · 0 评论 -
剑指offer09 --- 旋转数组中的最小数字
剑指offer09 — 旋转数组中的最小数字题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。思路可以直接循环遍历找最小值,但是复杂度为o(n),可利用题干中数组的递增信息,降低时间复杂度。首先引入二分查找法:d...原创 2020-05-06 16:07:05 · 126 阅读 · 0 评论 -
剑指offer24 --- 二进制中1的个数
剑指offer24 — 二进制中1的个数题目输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分析 & 解补码: 正数不变,负数是它的正数的反码+1。解法1 :转换为字符串# -*- coding:utf-8 -*-class Solution: def NumberOf1(self, n): # write code here n= 0xFFFFFFFF & n count = 0 for原创 2020-05-09 22:40:07 · 189 阅读 · 0 评论 -
Python随机数生成
Python随机数生成语法:import random #必须导入random模块,才可以调用类似于uniform的函数利用random模块生成满足几种需求的随机数,如下面几个例子:例子如果希望随机数为整数:方法1:可对其进行类型转换random.uniform(x,y) #用来随机生成一个[x,y]范围内的实数int(random.uniform(x,y))方法2:使...原创 2020-05-05 21:29:19 · 341 阅读 · 0 评论 -
剑指offer25 --- 不用加减乘除做加法
剑指offer25 — 不用加减乘除做加法题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。分析基础知识异或运算(^)如果对应位值不同(1,0或者 0,1),做^操作的运算结果为1,否则为0,也就相当于在不考虑进位的情况下做加法。与运算(&)只有两个都是1的时候才是1,而在二进制中需要进位也是只有两个都为1的情况,那么可以通过做&运算来找到需要进位的位置,并且左移来得到进位后的结果。按位取反 ~~x = -(x+1)原创 2020-05-11 20:30:28 · 161 阅读 · 0 评论 -
剑指offer17 --- 链表中倒数第k个结点
剑指offer17 — 链表中倒数第k个结点题目输入一个链表,输出该链表中的倒数第k个结点分析注意考虑边界条件k比链表长度小定义两个变量,变量之间间隔k,直到一个变量为Nonek比链表长度大直接return None解class Solution: def FindKthToTail(self, head, k): firstPoint=...原创 2020-05-07 12:31:27 · 163 阅读 · 0 评论 -
剑指offer18 --- 反转链表
剑指offer18 — 反转链表题目输入一个链表,反转链表后,输出新链表的表头。分析将现有的头换成尾,尾部的next为空从第二个node开始,循环将next指向前一个需要有一个指针一直指向还没有反转的链表的头部题目# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# sel...原创 2020-05-07 13:24:31 · 152 阅读 · 0 评论 -
算法与数据结构---位运算在深度感知中的应用
文章目录基础知识按位与 &按位或 |异或 ^异或的性质用途取反 ~用途左移 <<右移 >>不同长度怎么办?识别有效的IP地址题目判断子网掩码是否合法基础知识参考网站。按位与 &0&0=0 0&1=0 1&1=1用途清零: 与一个各位都为0的数值相与。取一个数字的指定位:取哪位就将哪位的mask置为0判断奇偶: 根据最后一位是0还是1来判断 if((a&1)==0)按位或 |用途将数据的某些位原创 2021-05-28 10:12:54 · 297 阅读 · 0 评论 -
算法与数据结构 --- 动态规划相关问题
文章目录概述背包问题购物单问题思考代码概述动态规划三要素:确定函数定义确定状态转移方程确定边界条件背包问题购物单问题0/1背包的变种,即有依赖的背包问题。出自华为机试-牛客HJ16。思考确定dp的含义:定义dp二维表,定义dp[i][j]为前i个物品在预算为j时候的最优选择的费用。确定状态转移方程:对于dp[i][j]来说,考虑两个问题,第一个问题,加不加入当前的这个第i个物品,第二个问题,当前的j能不能涵盖当前物品。对于这种有附件的情况,其实是在递推的基础上,再多加了一些原创 2021-05-27 17:01:24 · 444 阅读 · 0 评论 -
算法与数据结构 --- 约瑟夫环问题及其变种
剑指offer23 — 孩子们的游戏题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦原创 2020-05-08 21:19:06 · 482 阅读 · 0 评论