![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
算法复习
涛涛英语学不进去
Ctrl + C Ctrl + V AC !!! over .. next !!!
展开
-
给你二叉树的某个结点,返回其后继结点
一、右子树存在,则根据左中右,找到右子树中的最左结点,如果最左为null,则其父节点就是 中序遍历下的下一个结点。二、右子树不存在,则根据左 中 右,需要去找父结点,且当前树不能是右子树,不然就不是下一个,而是上一个。明确一点,中序遍历,左中右,首先,中肯定是存在的,就是本阶段,就要拿右子树做文章。给你二叉树中的某个结点,返回该结点的后继结点。后继结点:即中序遍历下的下一个结点。原创 2022-10-09 15:19:59 · 218 阅读 · 0 评论 -
二叉树的最大宽度
如何求一个二叉树的最大宽度可以借助容器,也可以使用标记。原创 2022-10-09 13:43:38 · 202 阅读 · 0 评论 -
能不能不给单链表的头节点,只给想要删除的节点,就能做到在链表上把这个点删掉?
能不能不给单链表的头节点,只给想要添加的节点和指定位置,就能做到在链表上把这个点添加?比如 A->B->C->D->null,此时给出E结点插入到C的前面,但只给出了C结点。思路很巧妙,比如 A->B->C->D->null,此时给出B结点,如果删除B结点。即把 B结点下一个结点的值赋值给B,然后删除下一个结点。在C的后面创建新结点,把C赋值给新结点。同理,就还要一种题型。原创 2022-10-07 16:00:48 · 283 阅读 · 0 评论 -
求两个可能有环或无环的链表的交点
给定两个可能有环也可能无环的单链表,头节点head1和head2。请实现一个函数,如果两个链表相交,请返回相交的 第一个节点。如果不相交,返回null【要求】如果两个链表长度之和为N,时间复杂度请达到O(N),额外空间复杂度 请达到O(1)。原创 2022-10-07 15:36:13 · 327 阅读 · 0 评论 -
leetcode刷题:复制带随机指针的链表
使用hashmap,键为当前结点,值为新结点,通过键值对的映射关系,可以找到对应的next和random的位置。// 变为 1 -> 1* -> 2 -> 2 * -> 3 -> 3*这样就可以通过 cur.next找到复制结点的位置,最后断开。把 // 1 -> 2 -> 3。原创 2022-10-06 23:55:52 · 121 阅读 · 0 评论 -
leetcode刷题:回文链表
题目链接 https://leetcode.cn/problems/aMhZSa。原创 2022-10-06 19:00:42 · 471 阅读 · 0 评论 -
排序算法总结
排序算法大总结原创 2022-10-04 15:08:58 · 323 阅读 · 0 评论 -
稳定的基数排序
蛮复杂的,可以准备十个桶分别放 当前位为 0-9 的数,也可以只用一个数组,预留好对应的位置,本题就是这样。从低位往高位循环,每次把数放到对应的位置,再拿出来。原创 2022-10-03 15:08:44 · 146 阅读 · 0 评论 -
稳定的计数排序
类似哈希法 ,使用位置数组放置每个元素,遍历数组。原创 2022-10-03 14:50:46 · 95 阅读 · 0 评论 -
不稳定的堆排序
数组存储数,左结点坐标=父结点坐标*2+1,右节点左坐标=左结点+1,父结点坐标=(子节点坐标-1)/2。原创 2022-09-28 11:35:29 · 110 阅读 · 0 评论 -
不稳定的快速排序
每次以末尾数字为基数,比它大的放右边,小的放左边,全排完就好了。原创 2022-09-24 15:59:23 · 72 阅读 · 0 评论 -
稳定的归并排序
把整个数组分成不同的小段。原创 2022-09-24 15:52:54 · 77 阅读 · 0 评论 -
稳定的插入排序
每次让前 i 个数有序。原创 2022-09-24 15:47:10 · 118 阅读 · 0 评论 -
稳定的冒泡排序
遍历当前数组,每次 把 当前位置 和 下一个位置 比较,如果比后一个位置大(小)则交换位置。比较完之后,当前的 arr[n-1]位置元素 比 前 n-2 个元素都大(小)原创 2022-09-24 15:44:54 · 73 阅读 · 0 评论 -
不稳定的选择排序
选择排序:遍历当前数组,每次把 当前位置右边 最小(大)的放到当前位置。每次前面的先排好。原创 2022-09-24 15:42:27 · 77 阅读 · 0 评论 -
数组中左边大于2倍右边数的总对数
左边依次后移,每个数和右边比较,如果比右边2倍还大,右边右移,直到不满足上述条件或结束。结果加上本次出现的次数。思路:归并排序,每次归并的过程中,左边和右边已经排好。对4来说,右边 1 1 是乘二还小的数 记作两次。对1来说,右边没有乘二还比它小的。原创 2022-09-23 13:37:33 · 124 阅读 · 0 评论 -
小和问题(递归法)
每次排好一个步长,如果右部分比左部分的值大,则sum+=(R-rightIndex+1)*helpArr[leftIndex],否则加0.所以小和为1+1+3+1+1+3+4+2=16。5左边比5小的数:1,3,4,2。第二种写法是O(NlogN)4左边比4小的数:1,3。第二种思路:归并排序思路。1左边比1小的数:没有。3左边比3小的数:1。2左边比2小的数:1。第一种写法是 O(N。原创 2022-09-22 18:12:20 · 72 阅读 · 0 评论 -
如何使用递归实现查找?
mid如果不加一,只能左边=start+mid,因为 int 向下取整,所以 ( start + mid ) / 2 只要不是整除,就都比实际值少1,所以第一种方法里,left不动,右边 start = mid+ 1。补救的方法就是,mid 计算时直接+1,那么left再减1,至少也是和原来的范围一样长,即使超了也只是超1, 那么右边right就可以不用变了。原创 2022-09-20 23:56:56 · 181 阅读 · 0 评论 -
数组实现队列,不用首尾指针互追
说到如何用定长数组实现队列,我的第一个想法就是搞成循环数组,首尾指针分别控制入队出队。事实证明这样可行,不过在首尾相撞时处理比较麻烦。新思路:给定大小,取元素位置,放元素位置。原创 2022-09-18 17:49:35 · 62 阅读 · 0 评论 -
异或运算详解
一个数组,其中元素有一个出现奇数次,其余都出现偶数次,找到那个出现奇数次的数。注意:以上交换,a和b可以是同一个值,但不可以是同一位置,否则双双置为0。一个数组,里面有一个数出现M次,其余数出现N次,其中N>M。一个数组,里面有两个数出现奇数次,其余出现偶数次。如何把int数的最右侧的1提取出来。异或,同0异1,无进位加法。经典交换两个数的顺序。a&(~a+1)即可。原创 2022-09-18 17:39:32 · 188 阅读 · 0 评论 -
回溯:组合、子集、排列 算法总结
for i =startIndex + 1, backtracking i + 1 // 不可重复使用当前元素。for i =startIndex + 1, backtracking i + 1 // 不可重复使用当前元素。for i =startIndex + 1, backtracking i + 1 // 不可重复使用当前元素。//重复解 则 跳过。for i = 0 //全排列。原创 2022-08-21 16:42:21 · 180 阅读 · 0 评论 -
二叉树的先序、中序、后序、层序遍历(递归&非递归)
递归非递归。原创 2022-08-20 18:59:28 · 397 阅读 · 0 评论 -
暴力递归到动态规划 08(小马走象棋)
考虑马儿的所有行程点,越界则不计入。原创 2022-08-02 16:32:10 · 258 阅读 · 0 评论 -
暴力递归到动态规划 07(516. 最长回文子序列)
给定一个字符串s,找到其中最长的回文子序列,并返回该序列的长度。可以假设s的最大长度为1000。示例1输入“bbbab”输出4一个可能的最长回文子序列为“bbbb”。示例2输入“cbbd”输出2一个可能的最长回文子序列为“bb”。...原创 2022-08-02 14:34:25 · 282 阅读 · 0 评论 -
暴力递归到动态规划 06 (剑指 Offer II 095. 最长公共子序列)
给定两个字符串text1和text2,返回这两个字符串的最长公共子序列的长度。一个字符串的子序列是指这样一个新的字符串它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace”是“abcde”的子序列,但“aec”不是“abcde”的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回0。示例1输入输出3解释。...原创 2022-08-02 11:58:35 · 94 阅读 · 0 评论 -
暴力递归到动态规划 05 (贴纸拼词)
第三个说是加了一个动态规划,其实就是记忆化搜索吧,每次变换后,在map数组中保留结果,下次计算时如果结果算过,直接返回这个结果。第一个比第二个少通过一个测例,第一个32/101;第二个33/101。...原创 2022-07-30 00:00:39 · 247 阅读 · 0 评论 -
leetcode刷题:动态规划06(整数拆分)
给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。返回你可以获得的最大乘积。贪心算法,这个有数学证明的。如果我知道结果的话。原创 2022-07-24 18:12:27 · 166 阅读 · 0 评论 -
leetcode刷题:动态规划05(不同路径 II)
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?如果第一行或者第一列有障碍物,则障碍物之后的路线均为0。网格中的障碍物和空位置分别用1和0来表示。这题难在障碍物上,可能不止一个障碍物。障碍物如果是起点,就直接返回0....原创 2022-07-23 11:26:31 · 146 阅读 · 0 评论 -
leetcode刷题:动态规划01(斐波那契数列)
斐波那契数,通常用F(n)表示,形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。F(n)=F(n-1)+F(n-2),其中n>1。这一已经是动态规划思想了,再整理整理。效果一般般,尝试加入数组,以空间换时间。给你n,请计算F(n)。先试试最熟悉的递归方式。...原创 2022-07-20 09:28:14 · 157 阅读 · 0 评论 -
leetcode刷题:回溯算法16(解数独)
力扣题目链接编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。一个数独。答案被标成红色。提示:...原创 2022-07-13 19:58:54 · 215 阅读 · 0 评论 -
leetcode刷题:回溯算法15(N皇后)
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例 1:示例 2:...原创 2022-07-12 19:04:48 · 141 阅读 · 0 评论 -
leetcode刷题:回溯算法14(重新安排行程)
力扣题目链接给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。提示:示例 1:示例 2:......原创 2022-07-12 15:16:42 · 1581 阅读 · 0 评论 -
leetcode刷题:回溯算法13(全排列 II)
力扣题目链接给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。示例 1:示例 2:提示:原创 2022-07-11 18:47:27 · 162 阅读 · 0 评论 -
leetcode刷题:回溯算法12(全排列)
力扣题目链接给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:原创 2022-07-11 13:02:13 · 121 阅读 · 0 评论 -
leetcode刷题:回溯算法11(递增子序列)
力扣题目链接给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:说明:原创 2022-07-11 11:29:09 · 95 阅读 · 0 评论 -
leetcode刷题:回溯算法10(子集 II)
力扣题目链接给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:原创 2022-07-10 23:01:54 · 110 阅读 · 0 评论 -
leetcode刷题:回溯算法09(子集)
力扣题目链接给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]...原创 2022-07-10 19:57:00 · 83 阅读 · 0 评论 -
leetcode刷题:回溯算法08(复原 IP 地址)
力扣题目链接给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。示例 1:示例 2:示例 3:示例 4:示例 5:提示:...原创 2022-07-10 18:11:20 · 455 阅读 · 0 评论 -
leetcode刷题:回溯算法07(分割回文串)
力扣题目链接给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: “aab”输出:[[“aa”,“b”],[“a”,“a”,“b”]]原创 2022-07-10 17:11:46 · 164 阅读 · 0 评论 -
leetcode刷题:回溯算法06(组合总和II)
力扣题目链接给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,所求解集为:[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]示例 2:输入: candida原创 2022-07-09 14:03:42 · 79 阅读 · 0 评论