数据结构与算法课程
文章平均质量分 53
韩绘锦
苟有恒何必三更灯火五更鸡,最无益莫过一日曝十日寒。
展开
-
剑指 Offer 45. 把数组排成最小的数
剑指 Offer 45. 把数组排成最小的数输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”提示:0 < nums.length <= 100说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0class Solution: def m原创 2021-11-21 16:25:22 · 162 阅读 · 0 评论 -
48. 旋转图像&54. 螺旋矩阵&498. 对角线遍历
48. 旋转图像给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例 2:输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15原创 2021-11-17 19:34:20 · 167 阅读 · 0 评论 -
128. 最长连续序列
128. 最长连续序列给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。进阶:你可以设计并实现时间复杂度为 O(n) 的解决方案吗?示例 1:输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。示例 2:输入:nums = [0,3,7,2,5,8,4,6,0,1]输出:9提示:0 <= nums.length <= 104-109 <原创 2020-12-22 11:02:49 · 274 阅读 · 0 评论 -
克隆图
133. 克隆图给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node { public int val; public List<Node> neighbors;} 测试用例格式:简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。原创 2020-09-23 14:44:19 · 234 阅读 · 0 评论 -
实现 strStr()
28. 实现 strStr()实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needle = "bba"输出: -1说明:当 needle 是空字符串时,我们应当返回什么值原创 2020-09-15 14:31:08 · 135 阅读 · 0 评论 -
K 个一组翻转链表
25. K 个一组翻转链表给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5说明:你的算法只能使用常数的额外空间。你不能只是单纯原创 2020-09-15 11:22:38 · 156 阅读 · 0 评论 -
两两交换链表中的节点
24. 两两交换链表中的节点给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.代码# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# sel原创 2020-09-15 09:50:30 · 248 阅读 · 0 评论 -
整数转罗马数字
12. 整数转罗马数字罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX +原创 2020-09-15 09:21:14 · 114 阅读 · 0 评论 -
Z 字形变换
Z 字形变换将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入:原创 2020-09-10 12:23:03 · 284 阅读 · 0 评论 -
排序方法&最小生成树
冒泡排序简单地说就是两层循环,第一次循环每循环一次就找到一个最大的排到列表的尾部(通过第二层循环里面不停的交换),这样第一次循环循环数组的长度次数,就可得到一个排序好的数组。def bubbleSort(input_list): n=len(input_list) if n==0: return [] sorted_list=input_list for i in range(n-1): bChanged=False pr原创 2020-08-07 23:47:16 · 426 阅读 · 0 评论 -
213. 打家劫舍 II
213. 打家劫舍 II你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [2,3,2]输出: 3解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是原创 2020-08-03 17:01:34 · 123 阅读 · 0 评论 -
198. 打家劫舍
198. 打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。示例原创 2020-08-03 00:50:25 · 68 阅读 · 0 评论 -
516. 最长回文子序列
516. 最长回文子序列给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。示例 1:输入:"bbbab"输出:4一个可能的最长回文子序列为 “bbbb”。示例 2:输入:"cbbd"输出:2一个可能的最长回文子序列为 “bb”。提示:1 <= s.length <= 1000s 只包含小写英文字母递归class Solution: def longestPalindromeSubse原创 2020-08-02 01:12:02 · 82 阅读 · 0 评论 -
33. 搜索旋转排序数组(记考试中出现的错误)
33. 搜索旋转排序数组class Solution: def search(self, nums: List[int], target: int) -> int: if not nums: return -1 # if target<nums[0]: # start=0 # end=len(nums)-1 # while start<=end:原创 2020-07-01 18:18:26 · 101 阅读 · 0 评论 -
76. 最小覆盖子串
76. 最小覆盖子串给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入: S = “ADOBECODEBANC”, T = “ABC”输出: “BANC”说明:如果 S 中不存这样的子串,则返回空字符串 “”。如果 S 中存在这样的子串,我们保证它是唯一的答案。代码刚开始的思路就是查找一s中每个字符开头的子串中符合条件的子串,并从中找到最小字串class Solution: def minWindow(self, s:原创 2020-06-18 00:37:40 · 106 阅读 · 0 评论 -
75. 颜色分类
75. 颜色分类给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。示例:输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]进阶:一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。你能想出一个仅原创 2020-06-10 13:31:45 · 200 阅读 · 0 评论 -
72. 编辑距离
72. 编辑距离给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)示例2:输入:word1原创 2020-06-09 23:51:32 · 108 阅读 · 0 评论 -
64. 最小路径和
64. 最小路径和给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1的总和最小。class Solution: def minPathSum(self, grid: List[List[int]]) -> int: m=len(grid)原创 2020-06-08 21:42:32 · 122 阅读 · 0 评论 -
56. 合并区间
56. 合并区间给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间[1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。法一class Solution: def merge(self, intervals: Li原创 2020-06-08 16:33:30 · 147 阅读 · 0 评论 -
337. 打家劫舍 III
337. 打家劫舍 III在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。# Definition for a binary tree node.# class TreeNode:#原创 2020-05-20 11:44:40 · 209 阅读 · 1 评论 -
115. 不同的子序列
115. 不同的子序列给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE”的一个子序列,而 “AEC” 不是)题目数据保证答案符合 32 位带符号整数范围。递归(超时了)class Solution: def numDistinct(self, s: str, t: str) -> int: l原创 2020-05-16 21:51:41 · 139 阅读 · 0 评论 -
114. 二叉树展开为链表
114. 二叉树展开为链表给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树将其展开为:通过次数40,350提交次数58,634在真实的面试中遇到过这道题?法一# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left原创 2020-05-15 23:13:41 · 119 阅读 · 0 评论 -
105. 从前序与中序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树根据一棵树的前序遍历与中序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树:通过次数65,024提交次数99,429 在真实的面试中遇到过这道题?# Definition for a binary tree node.# class TreeNode:# def __init__(self,原创 2020-05-14 20:11:53 · 120 阅读 · 0 评论 -
210. 课程表 II
210. 课程表 II现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例 1:输入: 2, [[1,0]] 输出: [0,1] 解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确原创 2020-05-14 11:30:14 · 143 阅读 · 0 评论 -
207. 课程表
207. 课程表你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]] 输出: true 解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。 示例2:输入: 2, [[1,0],[0,1]] 输出原创 2020-05-13 23:19:53 · 335 阅读 · 0 评论 -
98. 验证二叉搜索树
98. 验证二叉搜索树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1:输入:2 / \ 1 3 输出: true 示例 2:输入:5 / \ 1 4/ 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。 通过原创 2020-05-12 14:43:14 · 139 阅读 · 0 评论 -
不同的二叉搜索树
96. 不同的二叉搜索树给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ 3 2 1 1 3 2/ / \ \ 2 1 2原创 2020-05-12 13:54:23 · 202 阅读 · 0 评论 -
617. 合并二叉树
617. 合并二叉树给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL的节点将直接作为新二叉树的节点。示例 1:输入: Tree 1 Tree 21 2/ \ / \3 2原创 2020-05-11 19:43:22 · 119 阅读 · 1 评论 -
543. 二叉树的直径
543. 二叉树的直径给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。刚开始蠢蠢的做法,虽然蠢但也记录一下吧# Definition for a binary tr原创 2020-05-11 14:33:38 · 138 阅读 · 0 评论 -
538. 把二叉搜索树转换为累加树
538. 把二叉搜索树转换为累加树给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(GreaterTree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。例如:输入: 原始二叉搜索树:5/ 2 13输出: 转换为累加树:18/ 20 13注意:本题和 1038:https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/相同原创 2020-05-10 21:34:16 · 185 阅读 · 0 评论 -
226. 翻转二叉树
226. 翻转二叉树翻转一棵二叉树。示例:输入: 4/ 2 7/ \ / 1 3 6 9输出: 4/ 7 2/ \ / 9 6 3 1备注:这个问题是受到 Max Howell 的 原问题 启发的 :谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。# Definition for a binary tree node.# class TreeN原创 2020-05-10 00:48:13 · 148 阅读 · 0 评论 -
437. 路径总和 III
437. 路径总和 III给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \5 -3/ \ 3 2 11/ \ 3原创 2020-05-09 14:01:33 · 172 阅读 · 0 评论 -
格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。示例 1:输入: 2输出: [0,1,3,2]解释:00 - 001 - 111 - 310 - 2对于给定的 n,其格雷编码序列并不唯一。例如,[0,2,3,1] 也是一个有效的格雷编码序列。00 - 010...原创 2019-09-20 20:55:25 · 116 阅读 · 0 评论 -
二叉树的遍历(前序遍历,中序遍历,后序遍历,层序遍历)
144. 二叉树的前序遍历给定一个二叉树,返回它的 前序 遍历。示例:输入: [1,null,2,3]12/3输出: [1,2,3]进阶: 递归算法很简单,你可以通过迭代算法完成吗?递归# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# s...原创 2020-05-05 10:04:02 · 537 阅读 · 0 评论 -
二叉树的最近公共祖先
面试题68 - II. 二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 ...原创 2020-05-04 00:51:52 · 133 阅读 · 0 评论 -
子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]在真实的面试中遇到过这道题?是否来源:力扣(LeetCode)链接:https://leetcode-cn.com/prob...原创 2019-09-18 21:57:48 · 104 阅读 · 0 评论 -
蓝桥杯校内模拟赛
问题描述 将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQIAO、AAILNOQ等,注意这7个字母都要被用上,单词不一定有具体的英文意义。 请问,总共能排列如多少个不同的单词。答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。res=1for i in range(1,8): ...原创 2020-04-18 16:09:08 · 189 阅读 · 0 评论 -
蓝桥杯~算法训练 Sereja and Squares(python)
试题 算法训练 Sereja and Squares提交此题资源限制时间限制:4.0s 内存限制:256.0MB问题描述 Sereja在平面上画了n个点,点i在坐标(i,0)。然后,Sereja给每个点标上了一个小写或大写英文字母。Sereja不喜欢字母"x",所以他不用它标记点。Sereja认为这些点是漂亮的,当且仅当: ·所有的点可以被分成若干对,使得每个点恰好属于一一对之...原创 2020-04-15 00:41:11 · 2344 阅读 · 6 评论 -
蓝桥杯~算法训练 Yaroslav and Algorithm
试题 算法训练 Yaroslav and Algorithm提交此题资源限制时间限制:100ms 内存限制:128.0MB问题描述 (这道题的数据和SPJ已完工,尽情来虐吧!)Yaroslav喜欢算法。我们将描述一个他最喜欢的算法。1.这个算法接受一个字符串作为输入。我们设这个输入字符串为a。 2.这个算法由一些命令组成。i号命令的形式为"s[i]>>w[i]“...原创 2020-04-14 00:36:46 · 2430 阅读 · 9 评论 -
蓝桥杯~算法训练 猴子吃包子
试题 算法训练 猴子吃包子提交此题资源限制时间限制:1.0s 内存限制:256.0MB问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同;肉包每秒钟吃x个;韭菜包每秒钟吃y个;没有馅的包子每秒钟吃z个;现在有x1个肉包,y1个韭菜包,z1个没有馅的包子;问:猴子吃完这些包子要多久?结果保留p位小数。输入格式 输入1行,包含7个整数,分...原创 2020-04-13 00:27:07 · 369 阅读 · 0 评论