自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 算法刷题-回溯-总结(python)

子集问题:比如子序列问题,取所有组合的可能情况,满足条件即收集,注意的是序列满足条件的判断还有若存在重复数去重的判断,因为对排列位置固定要求,借助startindex即可实现。回溯:path.pop()排列问题:对应组合问题,不需要startindex来选择历史元素,只关心收集元素时元素不重复即可。若需要排列问题有重复元素则引入标志位数组,对已经使用过的元素减枝。组合问题:借助startindex排除选择元素时选择历史元素,排除排列情况,有时重复数组情况需要对数组排序,然后根据相邻重复跳过的原则实现。

2024-05-06 22:43:00 408 1

原创 算法刷题-回溯-491.递增子序列,46.全排列,47.全排列 II (python)

全排列则要关心数据的不同顺序关系,最终只取所有的叶子节点,不同的只是全排列无重复数,每次选择元素只要关心所愿的元素不在已选path里(若在path里继续选下一个元素,即continue),保证不重复即可,选择元素满足全排列长度即可。最好的办法是在选择元素时,引入used标志位,来标志每个元素的使用情况,若是使用过的元素和当前选择元素相同,则跳过(即continue)复盘:最关键的是数组中可能含有重复元素,如何处理呢,巧妙的方式是所选的元素没有在历史选择元素中,即避开重复元素第一个元素选择两次。

2024-05-06 22:09:21 211 1

原创 算法刷题-二叉树-Leetcode-654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索 (python)

想要搜索某个值是否存在,则可以根据二叉搜索树的特性,从根节点搜索,如果小于根节点,则说明可能存在在左树,否则右树,递归执行,直到找到该值返回所在节点,否则返回None。思路:最大的二叉树根据示例看是规律如下,即每次构建二叉树节点时,先找到当前区间最大值即为根节点值,然后划分左右区间分别为左右子树,再在左右区间递归实现寻找最大值作为左/右区间的根节点,直到构建完所有节点。异常判断,如果其中一个二叉树的节点为空,则返回另一个二叉树,若两个节点均存在则统计两节点的和,并且新建二叉树节点,依次递归实现。

2024-05-06 21:36:43 279 3

原创 算法刷题-回溯-93.复原IP地址, 78.子集, 90.子集II (python)

既然上一个分割字符串的题,可以将startindex当成分隔符,分割所得的字符为[startindex:i+1],递归控制分割的起始位置,通过startindex逐个递归,此时可以根据ip有效性进行剪枝;思路:相比于上一个子集问题,差异在于单层循环选择元素第二个2时,不做处理时,会有重复的集合.如何进行处理呢,结合。,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。思路:树形结构来考虑,递归来遍历所有元素,单次循环取所有可能集合。返回该数组所有可能的子集(包含空集)背景:给你一个整数数组。

2024-04-30 11:57:03 379 3

原创 算法刷题-回溯-39. 组合总和,40.组合总和II,131.分割回文串(python)

打印startindex发现自己对于startindex理解还不够深刻,startindex是当前固定元素进行试错匹配的元素坐标,当在startindex坐标进行找匹配元素时,匹配剩余元素即(i>startindex)才会遇到两个元素相同的情况,这个是随每次递归位置变化的,不是粗暴的判断不是首位元素。但因为此题可以选择重复元素,所以递归时坐标位置不移动;思路:这次数组里有重复元素,依次固定选择元素时,因为有重复元素,所以无法保证组合数唯一,所以可以通过给数组排序,遇到选择和上一个元素相同时则跳过。

2024-04-29 11:00:36 304

原创 算法刷题-回溯-216.组合总和III, 17.电话号码的字母组合(python)

等同给我既定的数字,求组合。整体的思路还是局部求所选字母组合情况【以前解法即先选定一个数,再往里加剩余的数,因为是组合只需要取之后没取过的元素,一直往里加,直到组合个数满足要求】,然后依次递归剩余元素组合的情况,本题的区别在于,每次选择元素的范围是固定的,收集条件好处理直接拼接字母数等于数字个数即可收集。将1-9个数依次选取,每个数对应剩余的数字又有n-i种可能,依次尝试,那么如何确定选取了k个数呢,和求组合一样满足k个数的条件,本题又加上一个求总和的条件,即满足长度为k的基础上总和也为n,则统计结果。

2024-04-27 12:12:14 170

原创 算法刷题-回溯-Leetcode-77. 组合(python)

思路:有n个数,取其中k个数,求所有可能组合。按照回溯的思路是按照数字顺序分别取(外层for循环,循环开始位置为变量),满足k个数时,即收集结果(结果收集);上面的答案还能减枝,即去掉一些可预见的不满足情况,如何要收集k个数,当取到第i个数时,要满足剩余的数够取k个,如不满足则可以去掉这些情况。1.确定回溯函数参数变量和返回值(一般是变更项,比如开始选数的位置,对于收集结果和临时存储变量则可使用全局变量);回溯法或试探法,它采用试错的方法,在解决问题时不断地尝试可能的解决方案。

2024-04-26 09:31:51 355 4

原创 算法刷题-二叉树-Leetcode-513.找树左下角的值,112. 路径总和 113.路径总和ii,106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列(python)

思路:还是回到递归思路上,求最大深度就是依次遍历根节点到叶子节点,此时要统计每次遍历至叶子节点(node没有左右孩子)的和是否满足条件,因为要累积所以还是子函数实现。背景:给一个二叉树,求有没有满足根节点到叶子节点的和是target,并把符合条件的路径都存起来。背景:给一个二叉树,求有没有满足根节点到叶子节点的和是target。106.从中序与后序遍历序列构造二叉树。105.从前序与中序遍历序列。513.找树左下角的值。113.路径总和ii。

2024-04-26 08:30:35 124

原创 算法刷题-二叉树-Leetcode-110.平衡二叉树,257. 二叉树的所有路径 ,404.左叶子之和(python)

257. 二叉树的所有路径。

2024-04-19 23:20:01 115 1

原创 算法刷题-二叉树-Leetcode-104.二叉树的最大深度,559.n叉树的最大深度, 111.二叉树的最小深度,222.完全二叉树的节点个数(python)

思路:递归法可以从根节点依次到叶子节点,每增加一个深度,结果为根节点基础上最小的左子树或者右子数,求最小深度即取左右子树最小值。思路:如果此时再用递归遍历同上题,have try n叉树和二叉树的区别是每个节点的子节点有多个,每次递归时需要循环遍历全部子节点。思路:递归法可以从根节点依次到叶子节点,每增加一个深度,结果为根节点基础上最长的左子树或者右子数,求最大深度即取左右子树最大值。(最小深度是从根节点到最近叶子节点的最短路径上的节点数量)(指从根节点到最远叶子节点的最长路径上的节点数。

2024-04-18 23:26:34 227 4

原创 算法刷题-二叉树-Leetcode-102. 二叉树的层序遍历,226.翻转二叉树 ,101.对称二叉树 2(python)

层序遍历则一层一层增加深度,第一层即根节点,第二层即上一节点的左右子树,第三层即上一节点集合依次的左右子树。注意,可能存在某个子节点缺失,所以判断左右存在时才可以往下一层集合添加;背景:层序遍历和递归不同,层序遍历是一层一层从左往右依次查找的。如何在二叉树结构上实现层序遍历呢,深度搜索时是利用递归,依次找左右子树。思路:递归实现比较简单,根据遍历递归的逻辑,每次先取左右子树,然后交换左右子树。背景:反转二叉树,是讲每个二叉树的左右子节点交换。复盘:注意一定先交换节点然后再往下递归。101.对称二叉树 2。

2024-04-17 23:45:17 327

原创 算法刷题-二叉树-理论基础(python)

1、哈夫曼编码,来源于哈夫曼树(给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为优异二叉树,也称为赫夫曼树(Huffman tree)。即带权路径长度最短的树),在数据压缩上有重要应用,提高了传输的有效性,详见《信息论与编码》。3、C++ STL中的set/multiset、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。二叉排序树就既有链表的好处,也有数组的好处, 在处理大批量的动态的数据是比较有用。前序遍历:指的根节点在前,然后左节点右节点依次类推。

2024-04-16 21:40:02 455

原创 算法刷题-栈和队列-Leetcode-239. 滑动窗口最大值,347.前 K 个高频元素(python)

复盘:字典排序可以使用sorted(dic.items(),key=lambda x:x[1],reverse=True) 最后取列表中第一个值,则可以用列表生成式【item[0] for item in dic】复盘:deq[-1]==(队列右侧元素),deq[0]==(队列左侧元素),deq.pop()==(从队列右侧删除元素),deq.popleft()==(从队列左侧删除元素)背景:给一个nums数组,一个长度k,求挪动滑动窗口区间里最大值。,请你返回其中出现频率前。背景:给你一个整数数组。

2024-04-15 23:57:06 197

原创 算法刷题-栈和队列-Leetcode-20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值(python)

因为括号判断类型多组合多,直接判断复杂,借助括号的特性(种类只有3种,遇到前半部分默认已知后半部分)只要遇到前半部分括号,去找后半括号即可,但可以存在先找的括号在最后才能匹配,即考虑用栈实现,最先入栈的最后出栈,结合上面的分析栈里的元素只关心匹配项后半部分即可。注意针对无效情况分析,如果开始括号多余后半部分(匹配为后半段但stack为空)则直接返回False,再判断如果类型不匹配返回Fasle,如果最后栈了还有元素即栈里,即括号只有前半部分,返回False。思路:无效情况分析:1:括号类型不匹配;

2024-04-14 00:00:51 138 1

原创 算法刷题-栈和队列-Leetcode-232.用栈实现队列,225. 用队列实现栈(python)

思路:用两个栈,新增就增加至一个栈里,删除就将第一栈弹出再压第二个栈,即能按照队列的先进先出,弹出最后一个元素,则return第2个栈里的元素,判断是否为空就看两个栈都为空。思路:入队好办新增即可,出队为了模拟栈的先进去的最后出去,可以采用双端队列每次加入的元素弹出后重新加入队列即可。复盘:学习思想,加以练习。225. 用队列实现栈。232.用栈实现队列。

2024-04-12 16:32:19 162

原创 算法刷题-字符串-28. 实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾(python)

依次遍历判断是几位数,记录几位数为N,直接判断当前子串的长度*重复倍数==s,则有戏。: 在字符串中查找子串的位置(从左到右),返回子串开始位置的索引,如果没有找到则返回-1。背景:给两字符串,求第2个字符串在第一个字符串中第一个匹配的下标,不存在则返回-1。: 将字符串中的每个单词的首字母转换为大写,其余字母转换为小写。: 使用指定的分隔符将列表中的元素连接成一个字符串。: 将字符串的首字母转换为大写,其余字母转换为小写。: 将字符串中的所有字符转换为大写。: 将字符串中的所有字符转换为小写。

2024-04-11 19:08:58 419

原创 算法刷题-字符串-leetcode-344.反转字符串,541. 反转字符串II, 卡码网:54.替换数字,151.翻转字符串里的单词,卡码网:55.右旋转字符串(python)

背景:给1字符串和1数值k,要求2k一组,前k个反转,后k个不动,然后分两类,如果剩余组的字符个数小于k全部反转;思路2:将str转成list,复用344.反转字符串的函数,循环将2k设置为步长,每次反转前k元素。思路:利用split空格分隔特点切分成list,直接反转list元素(单词),然后返回list通过join方法转为字符串。背景:给一字符串(空格分隔若干单词)要求返回反转单词后的字符串(单词看作一个整体)思路:思路1:以k为步长,设置一个flag来确定首次反转,再将flag取反。

2024-04-11 17:47:06 285

原创 算法刷题-哈希表理论基础-leetcode-454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和 (python)

给nums排个序(正序),根据nums【i】调整l和r,若l在i右侧,只用判断nums[i]小于0的就好(大于0都是正数不满足要求),如果三数之和>0,说明r大了,缩小r;思路:上来就是组合,感觉像是回溯问题(经典问题是多个数字求多少种组合问题,每次选一个,满足条件则收集结果,依次逐个遍历)但目前有四个数组,每个数组还有n个数,实践复杂度就是n*n*n*n,不合适。背景:题意给4个长度均为n的数组nums1,nums2,nums3,nums4,求分别在4个数组中挑1个元素最终4数和为0,问有多少种组合。

2024-04-11 15:44:06 483

原创 算法刷题-哈希表理论基础-leetcode-242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和 (python)

思路:字母数量是有限的,统计两个字符串中出现每个字母的次数,然后比较两个集合相等嘛?再优化下,只开辟一个统计列表,一个累计,一个去除,最后不用比较两统计列表相等,而是遍历列表的值如果不为0则返回False,否则true。思路:递归求解,但是递归的条件是什么?背景:给两个字符串,判断两个字符串中出现的字符次数相同,则为字母异位词返回true,否则false。背景:给两个数组,数组内有重复元素,求两个数组交集(输出结果元素唯一,顺序无要求)快乐数=组成数平方求和,再拆,最终为1,快乐数,否则不是。

2024-04-10 23:26:32 309

原创 算法刷题-链表理论基础-leetcode-24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,160.链表相交,142.环形链表II (python)

回到链表的特性,从当前节点可以指向下一节点,若设置2指针,第一个指针走完即可统计链表的长度len,第二个指针走到len-n即可,但是第一个指针走完后不好处理第2指针条件,可以转换思路先让第一个指针走n节点,然后第二个指针和第一个指针同步走,则知道指针走完,第二个指针走到倒数第n个节点位置。此时让一新的指针从头走,慢指针继续走,到相遇位置即为环的入口。但存在两个节点不一样长,判断两个链表指向下一节点的值是否相同,but怎么处理值相同但内存不同的节点,以及如何更新两个链表的节点来判断指向下一节点的值是否相同。

2024-04-10 22:04:14 1004

原创 算法刷题-链表理论基础-leetcode-203.移除链表元素,707.设计链表 ,206.反转链表 (python)

思路:因为有删除,统一按照虚拟头节点处理,获取:遍历至指定节点返回val;按坐标插入:遍历至指定坐标后,暂存下一节点位置,当前节点指向新节点,新节点指向暂存位置;链表反转(链表只能获取节点的值和指向下一节点的位置)示例A->B->C->D, A.next=B, B.next=C,C.next=D,D.next=None;注意链表非空状态才能判断【因为可能存在首节点为空,则使用虚拟头节点:新建一个节点指向原链表】,否则返回链表本身。题目要求:删除链表中所有val元素,返回新链表的头节点。

2024-04-06 23:13:28 333 1

原创 算法刷题-数组理论基础-leetcode-977.有序数组的平方 ,209. 长度最小的子数组,59.螺旋矩阵(python)

然后循环周期转换的节点可以根据转圈的起始节点转换(比如初时节点为[0,0]/【starti,startj】,第二圈节点则为[0+1,0+1]/【starti+1,startj+1】)最后处理最中间位置(n为奇数时,【n//count】【n//count】=最后一位) *其他注意事项转弯时重复项可通过每次赋值只赋值到偏移量前一行则容易处理。模拟一行行写入,先写第0行(0,j),再写第n列(i,n-1),然后写第n-1行(n-1,j),再写第0列(i,0)依次类推,总共需要写n//2次。

2024-04-04 18:18:31 441

原创 算法刷题-数组理论基础-leetcode-704. 二分查找,27. 移除元素(python)

尝试实践思路3,发现return的是数组的长度即len(nums)-count,但是存在特殊情况,就是如果数组只有一个元素val,也要删除。数组问题,熟悉常用函数的方法,优先考虑调用方法实现。leetcode-27. 移除元素。leetcode-27. 移除元素。熟悉二分思路,注意判断细节。

2024-04-03 23:25:37 286

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除