
算法和数据结构
青柠檬-hxj
本人所有博文若不特殊标注说明均为原创,是为了加深自己的理解和记忆而作,若需转载请标明出处,如有疑问欢迎讨论交流
展开
-
leetcode11 盛最多水的容器
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 2:输.原创 2021-07-02 08:36:41 · 100 阅读 · 0 评论 -
leetcode 19 删除链表的倒数第N个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例1输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2: 输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]# Definition for singly-linked list.# class ListNode:# def __ini.原创 2021-06-26 23:01:19 · 82 阅读 · 3 评论 -
leetcode6 Z字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入...原创 2021-07-01 23:02:11 · 104 阅读 · 1 评论 -
leetcode 三数之和
【代码】leetcode 三数之和。原创 2024-04-02 11:23:34 · 126 阅读 · 0 评论 -
leetcode152 乘积最大子数组
(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。结果不能为 2, 因为 [-2,-1] 不是子数组。子数组 [2,3] 有最大乘积 6。,请你找出数组中乘积最大的非空连续。测试用例的答案是一个。原创 2024-04-25 23:04:03 · 274 阅读 · 0 评论 -
leetcode 53 最大子数组和
请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。连续子数组 [4,-1,2,1] 的和最大,为 6。是数组中的一个连续部分。原创 2024-04-25 23:07:04 · 314 阅读 · 0 评论 -
leetcode88 合并两个有序数组
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。,5,6] ,其中斜体加粗标注的为 nums1 中的元素。最终,合并后数组不应由函数返回,而是存储在数组。需要合并 [1,2,3] 和 [2,5,6]。需要合并的数组是 [] 和 [1]。个元素表示应合并的元素,后。需要合并 [1] 和 []。中,使合并后的数组同样按。合并结果是 [1]。合并结果是 [1]。原创 2024-04-25 23:42:38 · 150 阅读 · 0 评论 -
leetcode 221 最大正方形面积
【代码】leetcode 221 最大正方形面积。原创 2024-04-26 11:37:00 · 347 阅读 · 0 评论 -
leetcode 110 平衡二叉树
【代码】leetcode 110 平衡二叉树。原创 2024-04-26 17:40:40 · 130 阅读 · 0 评论 -
leetcode 删除有序数组中重复的元素
/ 长度正确的期望答案。不需要考虑数组中超出新长度后面的元素。如果所有断言都通过,那么您的题解将被。不需要考虑数组中超出新长度后面的元素。,返回删除后数组的新长度。删除重复出现的元素,使每个元素。函数应该返回新的长度。的前两个元素被修改为。函数应该返回新的长度。的前五个元素被修改为。原创 2024-04-26 18:45:20 · 228 阅读 · 0 评论 -
leetcode 27 原地删除有序数组
你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。, 并且 nums 中的前五个元素为 [0, 1, 3, 0 ,4]。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。函数应该返回新的长度。函数应该返回新的长度。原创 2024-04-26 18:58:37 · 302 阅读 · 0 评论 -
leetcode 35 外观数列
countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。countAndSay(3) = 读 "11" = 二 个 1 = "21"countAndSay(2) = 读 "1" = 一 个 1 = "11"原创 2024-04-27 10:31:36 · 225 阅读 · 0 评论 -
leetcode28 找出字符串中第一个匹配项的下标
"leeto" 没有在 "leetcode" 中出现,所以返回 -1。第一个匹配项的下标是 0 ,所以返回 0。"sad" 在下标 0 和 6 处匹配。原创 2024-04-26 19:08:46 · 167 阅读 · 0 评论 -
leetcode 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为。原创 2024-04-27 10:13:23 · 258 阅读 · 0 评论 -
leetcode49. 字母异位词分组
是由重新排列源单词的所有字母得到的一个新单词。可以按任意顺序返回结果列表。给你一个字符串数组,请你将。原创 2024-04-27 16:07:06 · 325 阅读 · 0 评论 -
leetcode 70 爬楼梯
你有多少种不同的方法可以爬到楼顶呢?1. 1 阶 + 1 阶 + 1 阶。有两种方法可以爬到楼顶。1. 1 阶 + 1 阶。有三种方法可以爬到楼顶。2. 1 阶 + 2 阶。3. 2 阶 + 1 阶。原创 2024-04-27 22:57:59 · 339 阅读 · 0 评论 -
leetcode63 不同路径 II
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格的左上角 (起始点在下图中标记为 “Start” )。网格中的障碍物和空位置分别用。原创 2024-04-27 22:16:58 · 197 阅读 · 0 评论 -
leetcode62. 不同路径
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记“Finish”)。网格的左上角 (起始点在下图中标记为 “Start” )。问总共有多少条不同的路径?原创 2024-04-27 22:13:35 · 298 阅读 · 0 评论 -
leetcode58 最后一个单词的长度
由若干单词组成,单词前后用一些空格字符隔开。最后一个单词是长度为 6 的“joyboy”。是指仅由字母组成、不包含任何空格字符的最大。最后一个单词是“World”,长度为 5。最后一个单词是“moon”,长度为 4。原创 2024-04-27 22:10:50 · 345 阅读 · 0 评论 -
leetcode55 跳跃游戏
无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回。给你一个非负整数数组。原创 2024-04-27 22:08:34 · 178 阅读 · 0 评论 -
leetcode48 旋转图像
【代码】leetcode48 旋转图像。原创 2024-04-27 15:56:40 · 223 阅读 · 0 评论 -
leetcode541 反转字符串 II
从字符串开头算起,每计数至。原创 2024-04-27 12:02:52 · 185 阅读 · 0 评论 -
leetcode542 01矩阵
【代码】leetcode542 01矩阵。原创 2024-04-27 11:41:17 · 115 阅读 · 0 评论 -
leetcode40 组合总和
中的每个数字在每个组合中只能使用。给定一个候选人编号的集合。解集不能包含重复的组合。中所有可以使数字和为。原创 2024-04-27 11:27:07 · 173 阅读 · 0 评论 -
leetcode 39 组合总和
2 和 3 可以形成一组候选,2 + 2 + 3 = 7。注意 2 可以使用多次。如果至少一个数字的被选数量不同,则两种组合是不同的。7 也是一个候选, 7 = 7。,并以列表形式返回。中可以使数字和为目标数。对于给定的输入,保证和为。原创 2024-04-27 11:10:51 · 261 阅读 · 0 评论 -
将n个数分成m个小组
动态规划:转移方程: a[i][j] =a[i-j][j]+a[i-1][j-1]//大局观:首先,这j个数进行考察,首先,要么全都是大于等于2的,否则就有一个是1;//假如有一个是1,那么就直接将这个数拿出去,就是a[i-1][j-1];//假如说全都是大于等于2,那么就将每个都拿掉一层1,很明显,拿掉一层其实不影响数量的//到这里,我们就证明了,为什么 a[i][j] =a[i-j][j]+a[i-1][j-1];//因为,这里用了关于每个数一个整体的讨论,从而构建了递推公式//原创 2022-05-05 13:22:56 · 1260 阅读 · 0 评论 -
判断二叉树是否是完全二叉树
核心思路:1.如果有右节点,没有左节点,直接返回False2.如果左右节点都没有,或者只有左节点,就看看后面的节点,必须是叶节点,不能有子节点。(就是看看这是不是最后一排。)class IsCompleteTree: def iscompltee(self, root): res = [root] flag = 0 while res: cur = res.pop() if cur.原创 2022-04-26 10:43:26 · 836 阅读 · 0 评论 -
二分查找方法求解大于值的第一个元素
请实现有重复数字的升序数组的二分查找。输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数(指不存在大于等于查找值的数),则输出数组长度加一。示例:输入: 5,4,[1,2,4,4,5] 输出:3 (输出位置从1开始计算 )## 二分查找# @param n int整型 数组长度# @param v int整型 查找值# @param a int整型一维数组 有序数组# @return int整型#class Solution: def upper_原创 2021-07-20 07:32:44 · 1587 阅读 · 2 评论 -
leetcode97 交错字符串
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: s = s1 + s2 + ... + sn t = t1 + t2 + ... + tm |n - m| <= 1 交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...提示...原创 2021-07-18 21:20:59 · 119 阅读 · 0 评论 -
leetcode200 岛屿数量
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1示例 2:输入:grid = [...原创 2021-07-18 18:50:06 · 150 阅读 · 0 评论 -
leetcode 106 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7解题思路:中序:左根右,后序:左右根,先由后序遍历找根节点,然后 在中序遍历中找根节点位置,中序遍历左边的为左节点,右边的为右节点,递归构造整个二叉树# Definition f...原创 2021-07-12 07:46:57 · 105 阅读 · 0 评论 -
leetcoded 105 从前序与中序遍历恢复二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7解题思路:前序遍历:根左右,中序遍历:左根右,根据遍历特点,在前序遍历找到根节点,然后找到根节点在中序遍历中的位置,则中序遍历左边的为左子树,中序遍历右边的为右子树,依次迭代推导...原创 2021-07-11 11:58:36 · 143 阅读 · 0 评论 -
leetcode 107 二叉树的层序遍历
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层序遍历为:[ [15,7], [9,20], [3]]解题思路:迭代法遍历二叉树,类似二叉树的后序遍历迭代法,因为要将每层的节点放入一个列表中,所以单独对每层的节点用中间变量记录;从根节点开始,当前列表cu...原创 2021-07-11 11:40:00 · 85 阅读 · 0 评论 -
leetcode 145 二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [3,2,1]递归法# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left...原创 2021-07-07 23:25:50 · 152 阅读 · 2 评论 -
leetcode 144二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。示例 1:输入:root = [1,null,2,3]输出:[1,2,3]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]示例 4:输入:root = [1,2]输出:[1,2]示例 5:输入:root = [1,null,2]输出:[1,2]# Definition for a binary tree node.# class TreeN原创 2021-07-07 07:50:18 · 92 阅读 · 0 评论 -
leetcode 94 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回它的 中序 遍历。示例 1:输入:root = [1,null,2,3]输出:[1,3,2]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]示例 4:输入:root = [1,2]输出:[2,1]示例 5:输入:root = [1,null,2]输出:[1,2]递归法: 先遍历左,再遍历根,最后右# Definition for a binary tre原创 2021-07-07 07:45:16 · 115 阅读 · 0 评论 -
leetcode20 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "([)]"输出:false示例 5:输入:s = "{[]}"输出:true...原创 2021-07-06 08:07:10 · 87 阅读 · 0 评论 -
leetcode22 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]解题思路:使用回溯算法,初始化左右变量为括号对数n,然后左右括号依次添加到路径当中,当路径满足条件时返回结果;注意如果剩余的左括号数大于右括号,则该方案不满足题解条件,提前返回class Solution: de原创 2021-07-06 07:38:52 · 89 阅读 · 0 评论 -
leetcode 202 快乐数
编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 true ;不是,则返回 false 。示例 1:输入:19输出:true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 ...原创 2021-06-30 08:25:16 · 91 阅读 · 0 评论 -
leetcode 141 环形链表
给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head = [3,原创 2021-06-30 07:43:27 · 88 阅读 · 0 评论