算法题题解
文章平均质量分 50
Leetcode
ZboY.
韬光养晦,有所作为。
展开
-
Leetcode.0526 | 优美的排列
题目假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm(下标从 1 开始),只要满足下述条件之一 ,该数组就是一个 优美的排列 :1、perm[i] 能够被 i 整除2、i 能够被 perm[i] 整除给你一个整数 n ,返回可以构造的“优美的排列”的 数量 。示例输入:n = 2输出:2解释:第 1 个优美的排列是 [1,2]: - perm[1] = 1 能被 i = 1 整除 - perm[2] = 2 能被 i = 2 整除第 2 个...原创 2022-03-14 23:53:06 · 1289 阅读 · 0 评论 -
Leetcode.0143 | 重排链表
题目给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为:L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例输入:head = [1,2,3,4]输出:[1,4,2,3]解决方法1. 使用快慢指针的方式,寻找链表的中间节点。2.从中间节点的下一个节点为开头,将链表断成两半。原创 2022-01-22 17:29:41 · 63 阅读 · 0 评论 -
Leetcode.0378 | 有序矩阵中第k小的元素
题目给你一个n x n矩阵matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。示例输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8输出:13解释:矩阵中的元素为 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13输入:matrix = [[-5]], k = 1输出:-5解决方法使用二分法,...原创 2022-01-19 23:28:05 · 451 阅读 · 0 评论 -
Leetcode.0287 | 寻找重复数
题目给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。你设计的解决方案必须不修改数组 nums 且只用常量级 O(1) 的额外空间。示例输入:nums = [1,3,4,2,2]输出:2输入:nums = [3,1,3,4,2]输出:3输入:nums = [1,1]输出:1输入:nums = [1,1,2]原创 2022-01-08 20:29:52 · 56 阅读 · 0 评论 -
Leetcode.0437 | 路径总和
题目给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8输出:3解释:和等于 8 的路径有 3 条,如图所示。使用双重递归解决问题双重递归的主要应用于需要对每个节点进行相.原创 2022-01-08 00:19:01 · 584 阅读 · 0 评论 -
Leetcode.0215 | 数组中的第K个最大元素
题目给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例输入: [3,2,1,5,6,4] 和 k = 2输出: 5输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4解决方法使用堆排序解决此问题。首先在原地建立一个,做 k - 1次删除操作后堆顶元素就是我们要找的答案。根据初始数组,手动构建大根堆。大根堆的本质是一棵完全二叉树,所有的父结点原创 2022-01-06 19:04:16 · 365 阅读 · 0 评论 -
Leetcode.0236 | 二叉树的最近公共祖先
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。输入:root = [3,5,1,6,2,0,8,nul.原创 2022-01-06 13:35:29 · 531 阅读 · 0 评论 -
Leetcode.0207 | 课程表
题目你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对[0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。示例输入.原创 2022-01-05 15:37:08 · 1119 阅读 · 0 评论 -
Leetcode.0200 | 岛屿数量
题目给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1输入:grid = [ ["...原创 2022-01-04 23:39:52 · 61 阅读 · 0 评论 -
Leetcode.0148 | 排序链表
题目给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。要求时间复杂度为示例输入:head = [4,2,1,3]输出:[1,2,3,4]输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]解决方法使用归并排序。步骤如下:1.找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动2步,慢指针每次移动1步,当快指针到达链表末尾时,慢指针指向的链表节点即为链.原创 2022-01-03 13:29:28 · 635 阅读 · 0 评论 -
Leetcode.0394 | 字符串解码
题目给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例输入:s = "3[a]2[bc]"输出:"aaabcbc"输入原创 2022-01-02 17:35:41 · 84 阅读 · 0 评论 -
Leetcode.0399 | 除法求值
题目给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。返回 所有问题的答案 。如果存在某个无法确定的答案原创 2021-12-26 13:53:11 · 457 阅读 · 0 评论 -
Leetcode.0406 | 根据身高重建队列
题目假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。示例输入:people = [[7,0],[4,.原创 2021-12-18 23:59:27 · 77 阅读 · 0 评论 -
Leetcode.0416 | 分割等和子集
输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。解决方法本题的解法类似于...原创 2021-12-13 23:55:06 · 667 阅读 · 0 评论 -
Leetcode.0438 | 找到字符串中所有字母异位词
题目给定两个字符串s和 p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词:指由相同字母重排列形成的字符串(包括相同的字符串)。示例输入: s = "cbaebabacd", p = "abc"输出: [0,6]解释:起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。输入: s = "abab", p = "ab"输出: [0,1,...原创 2021-12-12 21:04:27 · 561 阅读 · 0 评论 -
Leetcode.0494 | 目标和
题目给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加'+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 。例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。示例输入:nums = [1,1,1,1,1], target = 3输出:5解释:一共有 5 种方法让最终目标和为 .原创 2021-12-12 01:02:14 · 191 阅读 · 0 评论 -
Leetcode.0538 | 把二叉树转化为累加树
题目给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node的新值等于原树中大于或等于node.val的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。示例输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]输出:[30,36,21,36,...原创 2021-12-07 22:39:39 · 60 阅读 · 0 评论 -
Leetcode.0543 | 二叉树的直径
题目给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例 1 / \ 2 3 / \ 4 5 返回3, 它的长度是路径 [4,2,1,3] 或者[5,2,1,3]。解决方法递归遍历二叉树的每一个节点,对于每一颗子树,其最大路径要么位于左子树,要么位于右子树,要么穿过根节点。当最大路径穿过根..原创 2021-12-06 22:28:42 · 51 阅读 · 0 评论 -
Leetcode.0560 | 和为K的子数组
题目给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的连续子数组的个数。示例输入:nums = [1,1,1], k = 2输出:2输入:nums = [1,2,3], k = 3输出:2解决方法对数组nums进行遍历,建立数组preSum,preSum[i]表示数组nums中从0到i的和。在遍历的过程中,使用哈希表记录各个preSum[i]及其出现的次数。对于当前计算到的preSum[i],若preSum[i]的值为k,则结果加一。然后...原创 2021-12-05 19:07:36 · 392 阅读 · 0 评论 -
Leetcode.0581 | 最短无序连续子数组
题目给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。示例输入:nums = [2,6,4,8,10,9,15]输出:5解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。输入:nums = [1,2,3,4]输出:0输入:nums = [1]输出:0解决方法...原创 2021-12-05 12:54:52 · 98 阅读 · 0 评论 -
Leetcode.0617 | 合并二叉树
题目给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为NULL 的节点将直接作为新二叉树的节点示例输入: Tree 1 Tree 2 1 2 ...原创 2021-12-01 22:55:10 · 61 阅读 · 0 评论 -
Leetcode.0621 | 任务调度器
题目给你一个用字符数组tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。然而,两个相同种类的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。你需要计算完成所有任务所需要的最短时间 。示例输入:tasks = ["A","A","A","B","B",.原创 2021-11-29 23:13:07 · 84 阅读 · 0 评论 -
Leetcode.0647 | 回文子串
题目给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例输入:s = "abc"输出:3解释:三个回文子串: "a", "b", "c"输入:s = "aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"解决方法:动态原创 2021-11-23 22:18:12 · 211 阅读 · 0 评论 -
Leetcode.0146 | LRU缓存机制
题目运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value)如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之...原创 2021-11-22 23:04:26 · 61 阅读 · 0 评论 -
Leetcode.0139 | 单词拆分
题目给你一个字符串 s 和一个字符串列表 wordDict 作为字典,判定s 是否可以由空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。示例输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。输入: s = "applepenapple", wordDict = ["apple", "pen"]输出.原创 2021-11-21 11:35:32 · 415 阅读 · 0 评论 -
Leetcode.0128 | 最长连续序列
题目给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n) 的算法解决此问题。示例原创 2021-11-21 01:04:06 · 94 阅读 · 0 评论 -
Leetcode.0098 | 验证二叉搜索树
题目给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例输入:root = [2,1,3]输出:true输入:root = [5,1,4,null,null,3,6]输出:false解释:根节点的值是 5 ,但是右子节点的值是 4 。解决方法在中序遍历的情况下,输出的二叉搜索树.原创 2021-11-20 11:51:38 · 395 阅读 · 0 评论 -
Leetcode.0096 | 不同的二叉搜索树
题目给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。示例输入:n = 3输出:5输入:n = 1输出:1解决方法动态规划。先寻找规律,当n为1的时候有1种二叉搜索树,当n为2的时候有两种二叉搜索树。当n为3时,头节点可能为1,可能为2,可能为3。头节点为1时,右子树有两个节点,而对于右子树来说,有两种二叉搜索树。此时,二叉搜索树的数量与n为2时的情况相同。 ...原创 2021-11-20 00:46:19 · 506 阅读 · 0 评论 -
Leetcode.0064 | 最小路径和
题目给定一个包含非负整数的mxn网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。输入:grid = [[1,2,3],[4,5,6]]输出:12解决方法使用动态规划方法。对于位置为(M,N)的网格,到达这个网格只能从(M-1,N)处或者(M,N-1)处出发...原创 2021-11-18 22:06:53 · 85 阅读 · 0 评论 -
Leetcode.0062 | 不同路径
题目一个机器人位于一个 m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例输入:m = 3, n = 7输出:28输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. 向下 -&.原创 2021-11-17 22:43:34 · 287 阅读 · 0 评论 -
Leetcode.0739 | 每日温度
题目请根据每日气温列表temperatures,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用0来代替。示例输入: temperatures = [73,74,75,71,69,72,76,73]输出:[1,1,4,2,1,1,0,0]输入: temperatures = [30,40,50,60]输出:[1,1,1,0]输入: temperatures = [30,60,90]输出: [1,1,0]解决方...原创 2021-11-13 22:57:21 · 986 阅读 · 1 评论 -
剑指offer学习笔记 | 数值的整数次方
题目实现pow(x,n),即计算 x 的 n 次幂函数(即,)。不得使用库函数,同时不需要考虑大数问题。示例输入:x = 2.00000, n = 10输出:1024.00000输入:x = 2.00000, n = -2输出:0.25000解释:2-2 = 1/22 = 1/4 = 0.25解决办法使用快速幂的方法,以为时间复杂度计算底数的n次幂。快速幂的方法基于二分的思想实现。使用递归方法计算a的n次方时,如果n是不为0的偶数,则先计算a的n/2次方,然后...原创 2021-10-23 21:46:55 · 55 阅读 · 0 评论 -
剑指offer学习笔记 | 二进制中1的个数
题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量).)。示例输入:n = 11 (控制台输入 00000000000000000000000000001011)输出:3解释:输入的二进制串 00000000000000000000000000001011中,共有三位为 '1'。输入:n = 128 (控制台输入 00000000000000000000000010000000)输出:1解释:输入的二..原创 2021-10-21 23:08:01 · 80 阅读 · 0 评论 -
剑指offer学习笔记 | 树的子结构
题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。示例:一个给定的树A: 3 / \ 4 5 / \1 2一个给定的树B: 4 /1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。示例输入:A = [1,2,3], B = [3,1]输出:false输入:A = [3,4,5,1,2], ...原创 2021-10-17 00:17:52 · 51 阅读 · 0 评论 -
剑指offer学习笔记 | 剪绳子
题目给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 ×.原创 2021-10-16 19:03:18 · 51 阅读 · 0 评论 -
剑指offer学习笔记 | 机器人的运动范围
题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例输入:m = 2, n = 3, k = 1输出:3输入:m = 3原创 2021-10-16 01:17:45 · 41 阅读 · 0 评论 -
剑指offer学习笔记 | 矩阵中的路径
题目给定一个m x n 二维字符网格board 和一个字符串单词word 。如果word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"输出:true...原创 2021-10-10 19:59:19 · 85 阅读 · 0 评论 -
剑指offer学习笔记 | 用两个栈实现队列
题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )示例输入: ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"][[],[],[5],[2],[],[]]1.创建队列,返回值为null2.删除栈底的元素,但..原创 2021-10-06 22:49:22 · 55 阅读 · 0 评论 -
剑指offer学习笔记 | 重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。示例Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]解决思路中序遍历序列中,排序方式为: 【左子树 | 根节点 | 右子树】前序遍历序列中,排序方式为: 【根节点 | 左子树 | 右子树】先找到前序遍历序列的第一个元原创 2021-10-05 17:24:07 · 65 阅读 · 0 评论 -
剑指offer学习笔记 | 从尾到头打印链表
题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例输入:head = [1,3,2]输出:[2,3,1]解决思路使用栈“先进先出”的特点,从头到尾将链表中的元素压入栈中。然后将栈中的元素依次弹出,弹出的次序就和原来链表中的次序相反。代码实现java版/** * Definition for singly-linked list. * public class ListNode { * int val; * ListN原创 2021-10-03 22:27:23 · 65 阅读 · 0 评论