
Data Structures and Algorithms
文章平均质量分 69
Data Structures and Algorithms
JunanP
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
我对做算法题的一点点心得
我是在今年七八月份的时候,为了准备秋招,才开始我两个月的LeetCode刷题之旅。当时好像是在一个codetop的网站上,我把字节的所有高频题都刷过一遍(出现过两三次以上),刷完之后我信心满满地去投了简历,投完过了五分钟我刷新了一下网页——“已结束”(简历直接挂了),哈哈哈哈。 后来无意间进了个实习(面试时甚至连算法都没问过),就直接停止再看LeetCode了。但因为自己当时确实是投入了很多去刷题,自己也有一点点心得,所以也才想在这里写些文章做个记录。在这里我想说一下我自己的看法: 首先...原创 2021-12-18 12:26:48 · 847 阅读 · 0 评论 -
最长递增子序列的个数 动态规划
673. 最长递增子序列的个数给定一个未排序的整数数组nums,返回最长递增子序列的个数。注意这个数列必须是严格递增的。示例 1:输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。示例 2:输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。思路: 这道题和 最长递增子序列 同源,但是在求长度的基础上...原创 2022-04-04 15:17:12 · 533 阅读 · 0 评论 -
LeetCode连续数组 前缀和
525. 连续数组给定一个二进制数组nums, 找到含有相同数量的0和1的最长连续子数组,并返回该子数组的长度。示例 1:输入: nums = [0,1]输出: 2说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。示例 2:输入: nums = [0,1,0]输出: 2说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。思路: 看到这一题,因为是连续子数组所以想尝试用滑动窗口来做,但仔细看题意给的条...原创 2022-04-04 11:15:02 · 523 阅读 · 0 评论 -
下一个更大元素III
556. 下一个更大元素 III给你一个正整数n,请你找出符合条件的最小整数,其由重新排列n中存在的每位数字组成,并且其值大于n。如果不存在这样的正整数,则返回-1。注意,返回的整数应当是一个32 位整数,如果存在满足题意的答案,但不是32 位整数,同样返回-1。示例 1:输入:n = 12输出:21示例 2:输入:n = 21输出:-1思路: 我们原来做过 下一个排列 那道题很类似。 从这道题是出题方式来看,我们似乎并...原创 2022-04-04 10:23:31 · 550 阅读 · 0 评论 -
下一个更大元素II 单调栈
503. 下一个更大元素 II给定一个循环数组nums(nums[nums.length - 1]的下一个元素是nums[0]),返回nums中每个元素的下一个更大元素。数字x的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出-1。示例 1:输入: nums = [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更...原创 2022-04-03 19:20:51 · 478 阅读 · 0 评论 -
LeetCode最大交换
670. 最大交换给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。示例 1 :输入: 2736输出: 7236解释: 交换数字2和数字7。示例 2 :输入: 9973输出: 9973解释: 不需要交换。注意:给定数字的范围是[0, 108]思路: 主要要找两个数,一前一后做交换嘛。 找第一个数:要让交换一次后的数字就有最大,我们只需要从数字的左边开始找,找到第一个比后面数字小的那个数字,这个数字就是我们要用来交换的第一...原创 2022-04-03 14:57:50 · 625 阅读 · 0 评论 -
LeetCode最长回文串
409. 最长回文串给定一个包含大写字母和小写字母的字符串s,返回通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。示例 1:输入:s = "abccccdd"输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。示例 2:输入:s = "a"输入:1示例 3:输入:s = "bb"输入: 2思路: 这道题不是在给的字符串中截取一个最长的回文串,而...原创 2022-04-03 12:01:46 · 790 阅读 · 0 评论 -
矩阵中的最长递增路径
329. 矩阵中的最长递增路径给定一个m x n整数矩阵matrix,找出其中最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例 1:输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]输出:4 解释:最长递增路径为[1, 2, 6, 9]。示例 2:输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]输出:4 ...原创 2022-04-01 22:32:09 · 1940 阅读 · 0 评论 -
和为K的子数组 前缀和
560. 和为 K 的子数组给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组的个数。示例 1:输入:nums = [1,1,1], k = 2输出:2示例 2:输入:nums = [1,2,3], k = 3输出:2思路: 总感觉以前写过这个题了,但是搜了一下又没有,好奇怪… 这道题要最优解,得用到一个比较冷门的技巧:前缀和。 “前缀和”听起来很高大上,其实就是将数组中的值累计加起来。比...原创 2022-03-30 23:44:30 · 321 阅读 · 0 评论 -
LeetCode另一棵树的子树
572. 另一棵树的子树给你两棵二叉树root和subRoot。检验root中是否包含和subRoot具有相同结构和节点值的子树。如果存在,返回true;否则,返回false。二叉树tree的一棵子树包括tree的某个节点和这个节点的所有后代节点。tree也可以看做它自身的一棵子树。示例 1:输入:root = [3,4,5,1,2], subRoot = [4,1,2]输出:true示例 2:输入:root = [3,4,5,1,2,n...原创 2022-03-30 23:36:40 · 579 阅读 · 0 评论 -
LeetCode旋转链表
61. 旋转链表给你一个链表的头节点head,旋转链表,将链表每个节点向右移动k个位置。示例 1:输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]示例 2:输入:head = [0,1,2], k = 4输出:[2,0,1]思路: 这道题是“旋转链表”而不是“翻转”,其实我觉得不如叫“平移”链表,无非就是输入的k为几,我们就把链表像“滚动播放的横屏广告”一样向右平移几个。 首先要判断给的k和链...原创 2022-03-30 23:29:50 · 748 阅读 · 0 评论 -
二叉树最大宽度
662. 二叉树最大宽度给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例 1:输入: 1 / \ 3 2 / \ \ 5 3 9 输出: 4...原创 2022-03-29 21:46:35 · 910 阅读 · 0 评论 -
剑指Offer 数组中的逆序对 归并排序
剑指 Offer 51. 数组中的逆序对难度困难686收藏分享切换为英文接收动态反馈在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5思路: 这道题题目可以说是“题狠话不多”了。只要有前面一个数字比后面数字大的情况,就可以算作是一个逆序对。第一时间想到的方法当然就是暴力遍历了:从第一个数开始,一直遍历到它之后的数;再从第二个数开始,再向后遍历……可以...原创 2022-03-29 20:29:01 · 443 阅读 · 0 评论 -
二叉树的完全性检验
958. 二叉树的完全性检验给定一个二叉树的root,确定它是否是一个完全二叉树。在一个完全二叉树中,除了最后一个关卡外,所有关卡都是完全被填满的,并且最后一个关卡中的所有节点都是尽可能靠左的。它可以包含1到2h节点之间的最后一级h。示例 1:输入:root = [1,2,3,4,5,6]输出:true解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。示例 2:...原创 2022-03-28 20:01:03 · 738 阅读 · 0 评论 -
LeetCode长度最小的子数组 滑动窗口
209. 长度最小的子数组给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥ target的长度最小的连续子数组[numsl, numsl+1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组[4,3]是该条件下的长度最小的子数组。示例 2:输入:target = 4, n...原创 2022-03-28 19:31:48 · 551 阅读 · 0 评论 -
剑指Offer 用两个栈实现队列
剑指 Offer 09. 用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:["CQueue...原创 2022-03-27 17:12:09 · 162 阅读 · 0 评论 -
LeetCode最大正方形 动态规划
221. 最大正方形在一个由'0'和'1'组成的二维矩阵内,找到只包含'1'的最大正方形,并返回其面积。示例 1:输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]输出:4示例 2:输入:matrix = [["0","1"],["1","0"]]输出:1示例 3:输入:matri...原创 2022-03-27 15:12:25 · 1376 阅读 · 0 评论 -
剑指Offer 二叉搜索树与双向链表
剑指 Offer 36. 二叉搜索树与双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希.原创 2022-03-27 14:56:06 · 147 阅读 · 0 评论 -
LeetCode最大数
179. 最大数给定一组非负整数nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。示例 1:输入:nums = [10,2]输出:"210"示例2:输入:nums = [3,30,34,5,9]输出:"9534330"思路: 这道题的意思很容易理解,但是解法却不容易想。我们普遍的思路是这样:我们希望数组相连组成的数字最大,那么肯定要比较所有数的第一个数字,第一个数字越大...原创 2022-03-26 19:41:14 · 340 阅读 · 0 评论 -
LeetCode岛屿最大面积
695. 岛屿的最大面积给你一个大小为m x n的二进制矩阵grid。岛屿是由一些相邻的1(代表土地) 构成的组合,这里的「相邻」要求两个1必须在水平或者竖直的四个方向上相邻。你可以假设grid的四个边缘都被0(代表水)包围着。岛屿的面积是岛上值为1的单元格的数目。计算并返回grid中最大的岛屿面积。如果没有岛屿,则返回面积为0。示例 1:输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0...原创 2022-03-26 19:36:46 · 639 阅读 · 1 评论 -
LeetCode寻找峰值 二分查找
162. 寻找峰值峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设nums[-1] = nums[n] = -∞。你必须实现时间复杂度为O(log n)的算法来解决此问题。示例 1:输入:nums = [1,2,3,1]输出:2解释:3 是峰值元素,你的函数应该返回其索引 2。示例2:输入:nums = [1,2,1,3,5,6,4...原创 2022-03-24 18:40:33 · 158 阅读 · 0 评论 -
删除排序链表中的重复元素 递归/非递归
83. 删除排序链表中的重复元素给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。示例 1:输入:head = [1,1,2]输出:[1,2]示例 2:输入:head = [1,1,2,3,3]输出:[1,2,3]思路: 这道题给的是排序好的链表,因此要删除的重复节点肯定也都是连在一起的,实现起来比较容易,我们只需要判断连续的节点是否重复即可。 有两种解决思路: 第一种是非递归的写法,就是用两个...原创 2022-03-24 18:35:31 · 800 阅读 · 0 评论 -
零钱兑换 动态规划
322. 零钱兑换给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。示例1:输入:coins = [1, 2, 5], amount = 11输出:3 解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coin...原创 2022-03-23 20:17:48 · 1047 阅读 · 0 评论 -
用 Rand7() 实现 Rand10()
470. 用 Rand7() 实现 Rand10()给定方法rand7可生成[1,7]范围内的均匀随机整数,试写一个方法rand10生成[1,10]范围内的均匀随机整数。你只能调用rand7()且不能调用其他方法。请不要使用系统的Math.random()方法。每个测试用例将有一个内部参数n,即你实现的函数rand10()在测试时将被调用的次数。请注意,这不是传递给rand10()的参数。示例 1:输入: 1输出: [2]示例 2:输入: 2...原创 2022-03-23 19:00:57 · 1864 阅读 · 0 评论 -
LeetCode路经总和Ⅱ
113. 路径总和 II给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22输出:[[5,4,11,2],[5,8,4,5]]示例 2:输入:root = [1,2,3], targetSum = 5输出:[]示例 3:...原创 2022-03-23 18:49:20 · 144 阅读 · 0 评论 -
平衡二叉树
110. 平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。示例 1:输入:root = [3,9,20,null,null,15,7]输出:true示例 2:输入:root = [1,2,2,3,3,null,null,4,4]输出:false示例 3:输入:root = []输出:true思路: 根据题意,要是平衡..原创 2022-03-22 20:13:59 · 463 阅读 · 0 评论 -
求根节点到叶节点数字之和
129. 求根节点到叶节点数字之和给你一个二叉树的根节点root,树中每个节点都存放有一个0到9之间的数字。每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径1 -> 2 -> 3表示数字123。计算从根节点到叶节点生成的所有数字之和。叶节点是指没有子节点的节点。示例 1:输入:root = [1,2,3]输出:25解释:从根到叶子节点路径 1->2 代表数字 12从根到叶子节点路径 1->3...原创 2022-03-22 20:08:38 · 348 阅读 · 0 评论 -
LeetCode重排链表
143. 重排链表给定一个单链表L的头节点head,单链表L表示为:L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为:L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[1,4,2,3]示例 2:输入:head = [1,2,3,4,5]输出:[1,5,2,4,3]思路...原创 2022-03-21 18:55:55 · 682 阅读 · 0 评论 -
LeetCode缺失的第一个正数
41. 缺失的第一个正数给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案。示例 1:输入:nums = [1,2,0]输出:3示例 2:输入:nums = [3,4,-1,1]输出:2示例 3:输入:nums = [7,8,9,11,12]输出:1思路: 题目中要我们找最小正整数,也就是要从1开始找,最容易想到的思路就是从i=1开始遍历;不断判断当前数...原创 2022-03-20 22:43:50 · 277 阅读 · 0 评论 -
最长公共子序列 动态规划
1143. 最长公共子序列给定两个字符串text1和text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列,返回0。一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ace"是"abcde"的子序列,但"aec"不是"abcde"的子序列。两个字符串的公共子序列是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = "a...原创 2022-03-20 17:49:28 · 98 阅读 · 0 评论 -
二叉树前序遍历 递归/非递归
如题。写完思路突然发现关于二叉树的中序遍历之前在这篇文章已经写了。所以把重复写的思路都删了,这篇就只贴个前序的代码吧。前序遍历-递归:class Solution(object): def preorderTraversal(self, root): ll = [] def qianxu(root): if root==None: return ll.append...原创 2022-03-20 12:54:32 · 279 阅读 · 0 评论 -
x的平方根 二分查找
69. x 的平方根给你一个非负整数x,计算并返回x的算术平方根。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去 。注意:不允许使用任何内置指数函数和算符,例如pow(x, 0.5)或者x ** 0.5。示例 1:输入:x = 4输出:2示例 2:输入:x = 8输出:2解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。思路: 这个题只需要精确到整数,所以并不算很麻烦。...原创 2022-03-20 11:38:58 · 207 阅读 · 0 评论 -
LeetCode二分查找 基础
704. 二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例 1:输入:nums= [-1,0,3,5,9,12], target= 9输出:4解释:9 出现在 nums中并且下标为 4示例2:输入:nums= [-1,0,3,5,9,12], target= 2输出:-1解释:2 不存在 nums中因此返回 -1思路: 二...原创 2022-03-07 19:58:12 · 357 阅读 · 0 评论 -
LeetCode螺旋矩阵
54. 螺旋矩阵给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]思路: 这道题意思理解起来非常容易,但解决是需要一点规律的...原创 2022-03-07 19:54:52 · 796 阅读 · 0 评论 -
合并两个有序数组
88. 合并两个有序数组给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。示例 1:输入...原创 2022-03-07 19:27:49 · 345 阅读 · 0 评论 -
二叉树的锯齿形层序遍历
最近又开始写小算法题了哈哈。大部分也是以前做过的普通而常见的题目。因为好像进入了低谷,做什么事都没有动力了,先写写这些好写的小算法题吧。103. 二叉树的锯齿形层序遍历 给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。示例 1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[20,9],[15,7]]示例 2:输入:root = [1]输出:...原创 2022-03-07 19:59:03 · 386 阅读 · 0 评论 -
K个一组翻转链表
25. K 个一组翻转链表给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗? 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。示例 1:输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]示例 2:输入:head = [1...原创 2022-03-07 19:11:02 · 409 阅读 · 0 评论 -
快速排序算法 数组中的第K个最大元素
215. 数组中的第K个最大元素给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。示例 1:输入:[3,2,1,5,6,4] 和k = 2输出:5示例2:输入:[3,2,3,1,2,4,5,5,6] 和k = 4输出:4思路: 思路很简单,先对数组进行从大到小的排序,然后取排序后的第k个值就得到了第k个最大元素啦。 像这种排序就占了几乎全部解题过程的题目...原创 2022-03-06 23:56:30 · 929 阅读 · 0 评论 -
反转链表Ⅱ
92. 反转链表 II给你单链表的头指针head和两个整数left和right,其中left <= right。请你反转从位置left到位置right的链表节点,返回反转后的链表。示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]示例 2:输入:head = [5], left = 1, right = 1输出:[5]进阶:你可以使用一趟扫描完成反转吗?思路:...原创 2022-03-05 14:08:14 · 572 阅读 · 0 评论 -
LeetCode课程表Ⅱ
210. 课程表 II现在你总共有numCourses门课需要选,记为0到numCourses - 1。给你一个数组prerequisites,其中prerequisites[i] = [ai, bi],表示在选修课程ai前必须先选修bi。例如,想要学习课程0,你需要先完成课程1,我们用一个匹配来表示:[0,1]。返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回任意一种就可以了。如果不可能完成所有课程,返回一个空数组。示...原创 2022-02-08 15:09:48 · 324 阅读 · 0 评论