- 博客(53)
- 收藏
- 关注
原创 4. 寻找两个正序数组的中位数(困难)
两个有序数组,寻找二者的中位数,最直观的方法是先归并这两个数组为一个有序数组,中位数则为中间的数字,算法时间复杂度为。通俗的说,即将数据一分为二,且其中一个集合中数据最大值小于等于另一个集合中数据的最小值。时,显然不能均分该两个数组,因此应首先判断两个数组的长度,将长度更小的数组作为第一个数组。时间复杂度,首先肯定不能先归并两个数组了,两个数组均有序,应当充分运用这个条件。,将两个数组一分为二,两个数组的左半部分构成一个集合,右半部分构成另一个集合。因此,对于题目中的两个数组,相当于要在数组。
2024-08-18 16:01:00
873
1
原创 695. 岛屿的最大面积(中等)
该题是典型的深度优先搜索题,深度优先搜索的基本思想是:从某个节点出发,尽可能深地搜索图的分支,直到达到叶子节点或图中所有可达的节点都被访问过。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这个过程一直进行到已发现从源节点可达的所有节点为止。深度优先搜索可以通过递归或栈(非递归)两种方式来实现。在刷题或者竞赛过程中,为节约时间,建议使用递归方式,但在实际工程应用中,一般使用栈的方式实现,使用栈更易理解,且更不易出现递归栈满的情况。
2024-08-18 15:59:30
731
原创 451.根据字符出现频率排序(中等)
对于本题,先统计各元素出现的频率,再以元素的频率作为桶,将相应频率的元素放入指定桶中。算法,区别在于本题是按照频率高低降序输出。可进一步优化,桶的数据为元素出现的最大频率。
2024-07-22 21:03:38
910
原创 75. 颜色分类(中等)
已经交换到尾部去了),对于右指针指向的值,可能为任意值,因此与遍历位置交换值后,该遍历位置还需要进行判断,并不能遍历下一个位置,否则会出现错误。只有三类颜色,按照指定颜色顺序排列,且原地排序,直使用。分别放入开头位置和结尾位置,因此可以使用双指针分别指向颜色。算法需要注意的细节是,对于左指针指向的值,一定不为颜色。(因为左指针指向的位置
2024-07-22 21:03:15
956
原创 347. 前 K 个高频元素(中等)
算法:桶排序(Bucket Sort)是一种排序算法,它通过将数据分散到有限数量的桶中,然后对每个桶中的数据单独进行排序,最后按照顺序将各个桶中的数据合并起来得到最终排序结果。简单的说,已知数据种类有限,逐一遍历数据并装入相应的桶中,仅需。对于本题,先统计各元素出现的频率,再以元素的频率作为桶,将相应频率的元素放入指定桶中。高的元素,因此需要先统计各个元素出现的次数,该步骤时间复杂度为。,再对各元素的出现频率进行排序,假定不同元素的个数为。可进一步优化,桶的数据为元素出现的最大频率。
2024-07-11 22:49:32
1508
原创 215. 数组中的第K个最大元素(中等)
划分,对于测试未通过的案例,即为一个极端案例。【该题leetcode的官方题解非常清晰,建议仔细阅读。为同一种算法代码实现,提交均为超出时间限制,未通过测试案例均为同一个,的大小关系将要排序的数据分成独立的两个部分,其中一部分的所有数据都比。元素,则已经找到答案,而不用关心左右两个区间中的数字是否有序。该题代码开发工作量略大,主要是边界问题的处理具体。中忽略了子区间仅为两个元素的情况,故造成错误;在左区间,则递归左区间,否则递归右区间。具体的,在实现过程中,若该位置。大),另外一部分的所有数据比。
2024-07-05 14:35:15
985
原创 540. 有序数组中的单一元素(中等)
数组中除了一个元素仅出现一次,其它元素均出现两次,因此数组的总长度为奇数,二分查找时的中位数恰好将数组等分,且一分为二后的左右区间的元素个数相同,元素个数可能为偶数或奇数。:对于数组中单独出现数字之前成双出对的元素来说,其索引下标均为先偶数再奇数,而单独出现数字后成双出对的元素来说,其索引下标均为先奇数再偶数,那么则可以利用该性质使用二分查找算法,对于。:对于数组中单独出现的数字,其它元素均成双出现,故单独出现数字的索引肯定为偶数,若下标为。元素相等),则单独出现的数字在右区间,否则在左区间;
2024-07-04 11:35:05
1252
原创 154. 寻找旋转排序数组中的最小值 II(困难)
非严格升序数组,即存在相同元素的两个值。如果不旋转则最小的数值即为第一个(索引为0)的数值,数组旋转了1到n次,寻找数组中最小的元素,这道题是二分查找的变型题。的基础上,将严格递增数组改为非递减数组,即允许存在相同元素,建议先尝试。的值,可以利用该性质使用二分查找算法。对于严格递增的数组,假定最小值为。,数组旋转后,假定结尾最后一个值为。时间复杂度的扫描遍历一次即可。,而其左边的元素均大于。并理解后再尝试本题。,其右边的元素均小于。
2024-07-04 00:02:32
802
原创 153. 寻找旋转排序数组中的最小值(中等)
严格升序数组,即不存在相同元素的两个值。如果不旋转则最小的数值即为第一个(索引为0)的数值,数组旋转了1到n次,寻找数组中最小的元素,这道题是二分查找的变型题。的值,可以利用该性质使用二分查找算法。,数组旋转后,假定结尾最后一个值为。时间复杂度的扫描遍历一次即可。,而其左边的元素均大于。,其右边的元素均小于。
2024-07-03 13:24:50
1001
原创 81. 搜索旋转排序数组 II(中等)
【可能最大的问题在于为什么能直接想到这个情况,这个确实需要经验,但如果实在想不到,可以正常编写代码,提交后分析错误案例,也能发现此规律】折半后左右区间有序,因此难以判断那个区间有序,针对此类情况需单独讨论,此时观察上述特例,发现有一个明显的特征,即。基础上,将条件严格升序数组改为非递减数组,再旋转后寻找目标值,仅需判断数组中是否存在目标值。类似,建议先练习该题,再练习本题,本题是在。将不再能判断左区间是否有序,例如。折半后左区间无序,而区间。折半后左区间又有序,区间。
2024-07-03 09:55:43
887
原创 33. 搜索旋转排序数组(中等)
的算法进行逐一遍历查找目标值的索引,但未能利用局部有序的特性。属于在有序的数组中查找数据,首先想到二分查找算法,但该题能使用二分查找算法吗?给定数组是严格有序的,但在某个位置的下标处进行了旋转,因此改变了数组有序的特性,但数组局部是有序的,虽可以使用算法复杂度为。是无序而非有序,因此应该修改此次代码边界条件,首先判断目标值是否在有序的左区间,不在则更新。,因为数组是局部有序的,如何利用数组局部有序特性呢?,则右区间有序,故首先判断目标值是否在右区间范围内,右区间为。是有序而非无序的,而右区间。
2024-07-02 13:33:05
894
原创 34. 在排序数组中查找元素的第一个和最后一个位置(中等)
在非递减(升序)数组中查找目标值的起始和结束位置,如果不存在则返回[-1,-1],最直观和直接的方法是依次遍历,第一次寻找到的位置为起始位置,记录下状态,当数组已遍历完或者遍历到非目标值时,此时上一个位置即为结束位置,时间复杂度为。指针记录的不一定是真实的目标值的起始或结束位置的索引,当未找到目标值的时候,程序循环也会结束,因为需要判断找到的起始或者结束位置是否在索引范围内,或者是否目标值,否则返回-1。对于起始位置,寻找第一个目标值的索引,相当于寻找在目标值出现之前,最后一个不为目标值的索引,加。
2024-07-02 00:33:51
1107
原创 69. x 的平方根(简单)
对于此题,是计算算术平方根的整数部分,因此等价于寻找首次平方之和大于x的数,该数减1即为x的算术平方根(假定x的算术平方根为y.z,其中y为整数部分,z为小数部分,y*y的结果是小于x,而(y+1)*(y+1)是大于x的)。不能使用系统内置的函数,寻找某个数(假定为x)的算术平方根,并返回算术平方根的整数部分,最直观的方法是从0依次开始尝试所有小于等于x的数(假定为y),当y*y的积小于等于x时,继续遍历下一个数,直至y*y的积首次大于x时,此时y-1即为x的算术平方根的整数部分,如。
2024-07-01 22:56:08
1022
原创 524. 通过删除字母匹配到字典里最长单词(中等)
针对字典的每一个单词,使用双指针分别指向给定的字符串和单词,同合并两个有序数组类似,两个指针均从左至右遍历。逐一判断两个指针指向的字符是否相同,如果相同,右指针(指向单词的指针)向右移动一位,左指针不管是否一致均向右移动一位,当字符串遍历完(左指针已移出字符串末尾)或者单词遍历完(右指针已移除单词末尾)时则停止遍历,此时若右指针指向位置已超出单词末尾则说明能够通过删除字符串中的字符得到单词,此时满足条件,如果当前单词长度大于已知的单词,或者长度相同但字典序更小,则此时更新答案。
2024-06-28 15:32:31
601
原创 680. 验证回文串 II(简单)
对于给定字符串s,根据回文字符串的对称性质,使用双指针,初始化时分别指向第一个和最后一个字符,左指针从左至右遍历,右指针从右至左遍历,判断指向的字符是否相同,如果不同则需要删除字符才可能满足回文,至于删除则有两种情况,是删除左指针还是右指针指向的字符,需要分别讨论。题目的另一种变型,由两数之和变为寻找最多删除一个字符,判断是否为回文字符串。
2024-06-28 14:45:43
980
原创 76. 最小覆盖子串(困难)
在s中寻找一个最短的子串,使之包含t中的所有字符,t中可能存在多个相同字符,寻找的子串也应至少含有相同数量的相同字符(示例3可以进一步确认)。子串即连续的一段子字符串区间,可以进一步总结为寻找一个区间,该区间内的字符包含t中的所有字符,即双指针,左指针指向子串的起始索引,右指针指向子串的结束索引,初始时,左右指针均指向s起始索引,两个指针均从左至右移动。step1:右指针开始移动,直至包含了t中的所有字符【需要注意的视,t中的单一字符可能会出现多次,因此首先需要统计各字符出现的次数】;
2024-06-26 13:41:38
466
原创 142. 环形链表 II(中等)
第三个指针开始移动时,为慢指针的位置是在第一次相遇点(距离入环处距离为x),第三个指针到入环点时,此时慢指针恰好也同时回到入环点(第三个指针走A,慢指针走了A=nB-x),慢指针和第三个指针将再次相遇,因此可以确定出入环位置。同理,如果是链表中有环,那么如果两个指针的速度不一致,那么这二者终将相遇,因此可以使用双指针,一个慢指针,一个快指针实现链表是否有环的判断:如果有环,二者终将相遇,如果没有环,快指针先到链尾,为便于计算,快慢指针速度为2:1。
2024-06-21 17:55:24
1001
原创 88. 合并两个有序数组(简单)
因此使用两个指针p1和p2,分别指向两个数组中的最后一个元素索引即m-1和n-1,当指针p1指向元素大于等于指针p2指向的元素时,则将指针p1指向的元素移入指定位置并指针向左移动一位(即p1–),否则,将指针p2指向的元素移入指定位置并指针向左移动一位(即p2–);两个数组均有序(非递减),要求合并两个数组,直观的思路,借助第三个数组,依次从左至右遍历两个数组,比较二者大小,将较小的依次放入第三个数组中,遍历完毕后,将第三个数组的元素再依次写入指定的第一个数组。
2024-06-18 18:35:37
382
原创 167. 两数之和 II - 输入有序数组(中等)
虽然类似,但增加了有序:寻找两个数时,固定第一个数,因此有序,因此第二个数可以直接使用二分查找算法,不用再逐一遍历。一个左指针(left)指向最小的元素,向右遍历;如果两个指针指向的元素之和大于目标值,那么将右指针左移动一位,使当前和变小一点;如果两个指针指向的元素之和小于目标值,那么将左指针右移动一位,使当前和变大一点;但需要注意的是,该题的索引是从1开始而不是0开始,因此索引值需要各加1。如果两个指针指向的元素之和等于目标值,那么它们就是我们想要的结果;
2024-06-14 18:33:56
789
原创 406. 根据身高重建队列(中等)
应当如何避免上述问题,如果我们始终按照身高由高到底的顺序恢复顺序,那么对于当前身高来说,前序的升高均不低于该升高,此时即可按照索引位置插入了,即采用贪心策略,贪心的先恢复当前队列最高身高属性的位置,对于当前[hi,ki]来说,当前已恢复队列中的升高均不低于hi,因此ki即为[hi, ki]对于此时队列所在的索引位置。2.按照身高降序的顺序依次放入队列中,对于第i个人,因为其身高小于等于前面0到i-1的人的身高故第i个人插入的位置并不会影响前面人的属性,因为第i个人前面有kj个人,故插入索引kj处。
2024-06-09 16:17:37
669
1
原创 122. 买卖股票的最佳时机 II(中等)
实现最大的利润,即只要有盈利就收入囊中,由于交易没有具体限制次数,因此可以依次判断每一天与前一天是否有利润,只要有利润即可实现盈利。:该方法仅能计算最大盈利,但不能求出具体的最佳买卖点,即并不是实际的股票交易过程。
2024-06-03 14:10:37
502
2
原创 763. 划分字母区间(中等)
对于每一个划分,都需要寻找最小结束下标(即该字符最后一个出现位置的索引),因此首先记录每一个字符最后一次出现位置的索引下标,当遍历一个字符时,即可找到满足该字符条件下最小的结束下标。当遍历一个字符c时,即可更新右指针right为max(right,c的结束位置),当遍历位置i和右指针right相遇时,即当前片段为满足条件的最小片段。寻找每个片段最小的结束下标的关键在于如何确保当前片段中的每个字母均已全部出现,因此需要记录每个字符总共出现的次数,当该片段所有字母均已出现即可判断找到最小的结束下标,即。
2024-06-03 10:02:58
770
原创 452. 用最少数量的箭引爆气球(中等)
引爆所有气球,弓箭数要最少,那么每支弓箭尽量多的引爆气球,采用贪心策略。对于重叠(仅边界重合也是重叠此题中)的区间,仅需一只弓箭即可引爆即可,因此问题转换为对于重叠的区间仅留一个区间即可,其它区间移除即可,最终留下的区间数则是所需的最少得弓箭数。题目类似,但有区间在于仅边界重合的也可仅用一只弓箭解决,因此对于边界重合的也要视为叠加。
2024-05-27 23:06:36
332
原创 605. 种花问题(简单)
因此,最多种植花朵的数量与连续空余位置以及两次是否有花的数量有关系,题目求解转换为遍历花坛的位置,寻找最长的连续空余位置,当满足n的时候即可结束返回真。【两侧有花】现在的问题在花坛中已有一些位置种植了花朵,因此仅能空余位置种植其它花朵,且必须符合规则,即空余位置两侧已有花朵,同样假设连续空余位置长度为m,此时最多种植花朵的数量为(m-1)除以2的商。[1,0,0,0,1],[1,0,0,0,0,1]的情况,此时种植1。[[1,0,1],[1,0,0,1]的情况,此时种植0;
2024-05-23 19:25:59
675
原创 SSH密钥生成
摘要:为什么使用SSH密钥,SSH密钥一个最大的优点是在保证安全认证的基础上,还能同时免密码登录,使得远程登录、git代码远程管理等应用场景不用输入密码即可实现登录或者代码拉取、推送等,更加便捷;至此,ssh密钥对(私钥和公钥)生成完毕,后缀为.pub表示公钥,另一个表示私钥(切记私钥不能分发,在公用服务服务器上开发时,为了配置git远程仓库的免密时,设置私钥的密码非常重要,具体配置见上图注释)。
2024-05-17 22:15:14
491
原创 Python入门(下)
在Python入门(中)介绍了Python语言的高级数据结构大汇总:列表、元组、数组、字符串、字典、集合和序列等,本任务将学习Python的进阶用法,从函数到高级魔法方法。 在Python中“万物皆对象”,函数也不例外,也可当作对象,可以从另外一个函数中返回出来进而构建一个高阶函数。 函数的定义很简单,使用def关键字,使用returen返回值,如:Python 的函数具有非常灵活多样的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。从简到繁的参数形态如下:变量作用域Lam
2024-05-17 22:11:48
765
原创 435.无重叠空间(中等)
它接收两个参数 o1 和 o2,分别表示需要比较的两个对象, 返回值为整数。要要移除区间的最少,即要求保留的区间最多,思考下,怎么样才能保证保留的区间呢?此时区间的结尾非常关键,结尾越小那么余留给其它区间的空间越大,因此采用贪心的策略。具体操作时,先按照结尾进行升序排序,从第二个区间开始判断,若该区间与前一个区间重叠则移除,否则则该区间作为下一个区间判断时的前一个区间。结尾越小余留的空间越大,因此需首先对各个区间按照结尾的大小进行升序排序,每次选择最小的结尾且与前一个选择的区间不重叠的区间。
2024-05-16 16:16:03
486
原创 135.分发糖果(困难)
其中需要注意的时,从右至左分配数,对于分数为5的孩子的糖数应该大于其右边分数为3的孩子,此时即分配4颗糖即可,但在从左至右时,其糖数应该大于左边分数为4的孩子,即分配5颗,因为需要同时满足二者条件,所以取最大值5颗。,且注意分数相同的情况下,则只分配1颗的情况也是满足题目要求的,现在总结规则,如果比相邻分数高,则至少大1,如果比左右邻的孩子都大,则应该至少是左右孩子分配数最大值+1,如果不是最大值,则不满足条件2,例如。,第三个孩子分配1颗,第二个孩子分高分配2颗,第一个孩子分配3颗。
2024-05-16 00:01:24
1030
原创 中M2021秋C语言入门练习第I段——变量、表达式、分支、循环(7-71至7-140)
中国大学MOOC浙江大学翁恺老师的《程序设计入门——C语言》2021秋季课程PTA编程练习题【其实每期练习题一致】,共140题,已全部答完,仅三道题借鉴了他人思维之后,全部为独立思考纯手敲代码(Dev-C++调试成功后,复制粘贴到PTA平台),现收集归拢【时间飞逝,存于优快云草稿箱三年了,现整理格式发布】。
2024-05-15 17:00:27
422
原创 中M2021秋C语言入门练习第I段——变量、表达式、分支、循环(7-1至7-70)
中国大学MOOC浙江大学翁恺老师的《程序设计入门——C语言》2021秋季课程PTA编程练习题【其实每期练习题一致】,共140题,已全部答完,仅三道题借鉴了他人思维之后,全部为独立思考纯手敲代码(Dev-C++调试成功后,复制粘贴到PTA平台),现收集归拢【时间飞逝,存于优快云草稿箱三年了,现整理格式发布】。
2024-05-15 11:35:13
291
原创 409.最长回文串(简单)
注意仔细阅读回文串的定义,以及仔细观察回文串组成字符的数量特点,从左往右和从右往左读都是一样的,说明一旦左边有一个字符,那么必然右边有一个相同的字符,因此说明回文字符串中出现的字符的次数一定是偶数的,因此,根据上述回文串的特点,为了利用已有字符实现最长回文串,则需最大限度的利用所有的字符(若某字符个数为n,如果n为偶数则使用n个,否则使用n-1个,只要为偶数个则一定可以构成回文),level、noon、racecar、civic和deified。的概念,指:左往右读和从右往左读都是一样的字符序列,例如。
2024-05-12 21:47:44
413
原创 455.分发饼干(简单)
因此首先从最小胃口的孩子开始考虑,为满足更多其余孩子的情况,因此仅选择满足当前孩子胃口的最小饼干分配给他(如果不是满足当前孩子最小的,选了一个大的,那这个最小的也不会满足其它孩子的胃口;满足了当前孩子后,对于剩余的孩子依次采用相同的策略,考虑剩余孩子中最小胃口的孩子,直到所有孩子均查看完或者没有饼干再分即结束。当然是胃口越小的越容易满足(PS:因为胃口越小,能够满足的饼干尺寸越多,选择满足的最小尺寸,剩下的饼干又可以满足更大胃口的孩子,进而能够满足的孩子数量越多)。,同理,是从最小尺寸的饼干开始判断,
2024-05-08 21:34:02
941
1
基于Python实现生辰纳音五行计算(源码/.py)
2024-06-18
Python素数判断类
2023-10-21
mc-蒙特卡洛方法计算圆周率(源码/.py)
2023-10-20
Python日期时间戳转换类(Class)
2023-10-20
基于Python实现生辰纳音五行计算(字节码/.pyc)
2023-07-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人