算法刷题
文章平均质量分 54
周小兔的大管家
每天努力一点点,已负韶华,不可再虚度余生
展开
-
将有序数组转为平衡二叉搜索树【二叉树】
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1:输入:nums = [-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:示例 2:输入:nums = [1,3]输出:[3,1]原创 2023-03-14 11:01:28 · 151 阅读 · 0 评论 -
二叉搜索树中的插入操作【二叉树】
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。你可以返回 任意有效的结果。原创 2023-03-14 09:56:45 · 161 阅读 · 0 评论 -
二叉树的最近公共祖先【二叉树】
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3。来源:力扣(LeetCode)著作权归领扣网络所有。原创 2023-03-13 14:41:34 · 96 阅读 · 0 评论 -
合并二叉树【二叉树】
给你两棵二叉树: root1 和 root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。注意: 合并过程必须从两个树的根节点开始。示例 1:输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]原创 2023-03-10 09:19:24 · 77 阅读 · 0 评论 -
最大二叉树【二叉树】
给定一个不重复的整数数组 nums。最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。返回 nums 构建的 最大二叉树。示例 1:输入:nums = [3,2,1,6,0,5]输出:[6,3,5,null,2,0,null,null,1]来源:力扣(LeetCode)著作权归领扣网络所有。原创 2023-03-09 17:11:07 · 77 阅读 · 0 评论 -
二叉树【从中序与后序遍历序列构造二叉树】
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。示例 1:输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]输出:[3,9,20,null,null,15,7]示例 2:输入:inorder = [-1], postorder = [-1]输出:[-1]来源:力扣(LeetCode)原创 2023-03-09 16:27:04 · 47 阅读 · 0 评论 -
二叉树【翻转二叉树】
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。原创 2023-02-27 09:18:03 · 45 阅读 · 0 评论 -
动态规划【0-1背包之分割等和子集】
给你一个 只包含正整数 的 非空 数组 nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例 1:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11]。示例 2:输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。来源:力扣(LeetCode)著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。原创 2023-02-21 15:03:25 · 45 阅读 · 0 评论 -
动态规划【0-1背包_使用一维数组】
接着上一篇0-1背包的问题,改用一维数组实现。原创 2023-02-20 11:19:38 · 79 阅读 · 0 评论 -
动态规划【0-1背包】
背包最大重量为4。现在有三种物品可以装,重量和价值如表格问背包能背的物品最大价值是多少?原创 2023-02-19 23:13:02 · 67 阅读 · 0 评论 -
动态规划【整数拆分】
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积。示例 1:输入: n = 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: n = 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。来源:力扣(LeetCode)著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。原创 2023-02-13 17:22:59 · 504 阅读 · 0 评论 -
动态规划【不同路径——有障碍物】
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。示例 1:输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输出:2解释:3x3 网格的正中间有一个障碍物。原创 2023-02-13 15:25:48 · 805 阅读 · 0 评论 -
动态规划【不同路径】
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。输入:m = 7, n = 3输出:28示例 4:输入:m = 3, n = 3输出:6。原创 2023-02-13 11:16:31 · 74 阅读 · 0 评论 -
动态规划【最小代价爬楼梯】
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1:输入:cost = [10,15,20]输出:15解释:你将从下标为 1 的台阶开始。输入:cost = [1,100,1,1,1,100,1,1,100,1]输出:6解释:你将从下标为 0 的台阶开始。来源:力扣(LeetCode)原创 2023-02-12 17:03:09 · 149 阅读 · 0 评论 -
动态规划【爬楼梯】
爬楼梯==斐波那契数列原创 2023-02-11 16:40:37 · 39 阅读 · 0 评论 -
动态规划【斐波那契数列】
递归法和动态规划求解斐波那契数列原创 2023-02-09 17:18:47 · 198 阅读 · 0 评论 -
【滑动窗口最大值】——单调队列
单调队列解决滑动窗口最大值问题原创 2022-07-25 15:18:20 · 211 阅读 · 0 评论 -
【两个队列模拟栈】——栈与队列
这个方法虽然实现了,但是空间复杂度比较高,因为每次都会new一个新的ArrayList,我本想用clear()方法情况queue2,但是会导致下面的top方法报错,目前不太清楚什么原因,以后解决了再来补上。原创 2022-07-22 12:38:26 · 1553 阅读 · 0 评论 -
颠倒字符中的单词
给你一个字符串s,颠倒字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。示例1输入输出示例2输入输出解释颠倒后的字符串中不能存在前导空格和尾随空格。示例3输入输出解释。...原创 2022-07-19 08:42:56 · 53 阅读 · 0 评论 -
反转字符串II —— 双指针
这种题重点在理解题意,有时候会被绕晕,不确定边界,明白了逻辑,写起来其实很简单,容易出错的也就是写注释的那里,稍不注意就会越界了。原创 2022-07-18 09:12:50 · 82 阅读 · 0 评论 -
【四数之和——双指针】
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0 ...原创 2022-07-08 16:22:28 · 37 阅读 · 0 评论 -
【三数之和——双指针法】
三数之和的双指针法原创 2022-07-08 10:41:47 · 190 阅读 · 0 评论 -
【哈希表——两数之和】
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target = 6输出:[原创 2022-07-07 17:13:14 · 260 阅读 · 0 评论 -
哈希表——有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false来源:力扣(LeetCode)链接:https://leetcode.cn/problems/valid-anagram著作权归领扣网络所有。商业转载请联系官方授权,非商业原创 2022-06-12 15:42:17 · 85 阅读 · 0 评论 -
链表——环形链表(双指针)
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。示例 1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表原创 2022-06-12 12:34:13 · 163 阅读 · 0 评论 -
链表——两两交换链表中的节点(虚拟头节点方法)
题目给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。题目链接示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]来源:力扣(LeetCode)链接:https://leetcode.cn/problems/swap-nodes-in-pairs著作权归领扣网络所有。商业转载请联系官方授权,原创 2022-05-29 13:42:16 · 249 阅读 · 0 评论 -
链表——设计链表(查找,插入,删除)
题目设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表原创 2022-05-26 22:28:06 · 261 阅读 · 0 评论 -
链表——移除链表元素
题目给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]来源:力扣(LeetCode)链接:https://leetcode.cn/problems/rem原创 2022-05-26 18:10:04 · 279 阅读 · 0 评论 -
数组——螺旋矩阵
题目给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。题目链接示例 1:输入:n = 3输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:输入:n = 1输出:[[1]]来源:力扣(LeetCode)链接:https://leetcode.cn/problems/spiral-matrix-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路我觉得这个题考查的是边界原创 2022-05-26 16:21:44 · 201 阅读 · 0 评论 -
数组——长度最小的子数组(滑动窗口)
题目给定一个含有 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, nums = [1,4,4]输出:1示例 3:原创 2022-05-25 23:23:28 · 141 阅读 · 1 评论 -
数组——有序数组的平方(双指针)
数组——有序数组的平方(双指针)给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]来源:力扣(LeetCode)链接:https://leet原创 2022-05-25 21:55:43 · 110 阅读 · 0 评论 -
数组——移除元素(暴力+双指针)
数组——移除元素题目给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/remove-element著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。1.暴力解法暴力解法就是用两原创 2022-05-25 17:39:28 · 211 阅读 · 0 评论 -
数组——二分查找
数组——二分查找今天是2022年5月25日,作为跨专业的计算机双非硕,研一上学期按部就班上课,没有太明确自己的方向,寒假算是定了java开发的方向,下学期课程不算多,学完了javase,ssm,虽然理解还比较浅显,但是觉得是时候开始刷算法题了。目前打算跟着卡尔哥的代码随想路的刷题顺序刷题,如果有些觉得对自己是比较重要的点,就记录在这里,供自己复习。虽然很菜,虽然不如很多本科生,但是我还不想放弃!确定中点这里按照我之前学数据结构时点写法,就是简单的int mid = (left + right) / 2原创 2022-05-25 10:10:18 · 79 阅读 · 0 评论