leetcode刷题
文章平均质量分 50
livingsu
这个作者很懒,什么都没留下…
展开
-
leetcode 993. 二叉树的堂兄弟节点
一、题目在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。输入:root = [1,2,3,4], x = 4, y = 3输出:false二、解法思路:显然用深度优先搜索(dfs)。要得到结果,原创 2021-05-17 10:10:31 · 130 阅读 · 0 评论 -
leetcode 1734. 解码异或后的排列
一、题目给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。输入:encoded = [3,1]输出:[1,2,3]解释:如果 perm = [1,2,3]原创 2021-05-11 09:09:48 · 238 阅读 · 1 评论 -
leetcode 938. 二叉搜索树的范围和
一、题目给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。输入:root = [10,5,15,3,7,null,18], low = 7, high = 15输出:32二、解法2.1 dfs深度优先搜索思路是用递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeN原创 2021-04-27 08:24:57 · 88 阅读 · 0 评论 -
leetcode 377. 组合总和 Ⅳ
一、题目给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。输入:nums = [1,2,3], target = 4输出:7解释:所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。二、解法思路:动态规划该问题本质上是原创 2021-04-24 16:29:08 · 99 阅读 · 0 评论 -
leetcode 剑指 Offer 25. 合并两个排序的链表
一、题目输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。输入:1->2->4, 1->3->4输出:1->1->2->3->4->4二、解法思路:引入一个虚拟头结点,然后用双指针遍历两个链表,如果一个链表已经结束,则遍历结束/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *原创 2021-04-22 11:30:10 · 83 阅读 · 0 评论 -
leetcode 91. 解码方法
一、题目一条包含字母 A-Z 的消息通过以下映射进行了 编码 :A->'0'B->'1'...Z->'26' 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:“AAJF” ,将消息分组为 (1 1 10 6)“KJF” ,将消息分组为 (11 10 6)注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。给你一个原创 2021-04-21 21:55:25 · 161 阅读 · 0 评论 -
leetcode 146. LRU 缓存机制
一、题目运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之原创 2021-04-21 21:28:30 · 93 阅读 · 0 评论 -
leetcode 26. 删除有序数组中的重复项
一、题目给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。二、思路2.1 STL自带的unique思路:unique可以返回数组两个迭原创 2021-04-18 14:00:34 · 123 阅读 · 0 评论 -
leetcode 220. 存在重复元素 III
一、题目给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。输入:nums = [1,2,3,1], k = 3, t = 0输出:true输入:nums = [1,5,9,1,5,9], k = 2, t = 3输出:false二、解法2.1 滑动窗口+set思路:原创 2021-04-17 16:51:19 · 91 阅读 · 0 评论 -
leetcode 213. 打家劫舍 II(c++)
一、题目你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2),因为他们是相邻的。原创 2021-04-15 08:47:23 · 183 阅读 · 0 评论 -
leetcode 208. 实现 Trie (前缀树)
一、题目Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsW原创 2021-04-14 08:51:44 · 86 阅读 · 0 评论 -
leetcode 783. 二叉搜索树节点最小距离
一、题目给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。输入:root = [4,2,6,1,3]输出:1提示:树中节点数目在范围 [2, 100] 内0 <= Node.val <= 105二、解法解法一:递归遍历、求左右子树的最值思路:对于root,找到它左子树的最大值和右子树的最小值,进行比较/** * Definition for a binary tree node. * struct TreeNode { *原创 2021-04-13 08:38:00 · 116 阅读 · 0 评论 -
leetcode 179. 最大数
一、题目给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。输入:nums = [3,30,34,5,9]输出:“9534330”输入:nums = [0,0,0,0]输出:“0”二、解法思路:显然就是将nums进行排序,然后再拼接起来,所以主要问题是排序规则。排序规则:给定字符串a,b,当a+b>b+a时即可也可以用一个long类型,存放拼接的a+b和b+a进行比较原创 2021-04-12 11:23:52 · 231 阅读 · 0 评论 -
leetcode 264. 丑数 II
一、题目给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数 就是只包含质因数 2、3 和/或 5 的正整数。输入:n = 10输出:12解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。输入:n = 1输出:1解释:1 通常被视为丑数。二、解法思路:动态规划设dp[i]表示第i个丑数,dp[1]=1,题目求dp[n]由于丑数=前一个较小的丑数 乘以 因子(2或3或5),故可以用3指针法,每一个指针指向前一个较小丑原创 2021-04-11 11:56:34 · 231 阅读 · 0 评论 -
leetcode 154. 寻找旋转排序数组中的最小值 II
一、题目已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。给你一个可能存在 重复 元素值的数原创 2021-04-09 10:36:30 · 71 阅读 · 0 评论 -
leetcode 153. 寻找旋转排序数组中的最小值
一、题目已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。输入:nums = [3,4,5,1,2]输出:1解释:原数组为 [1,2,3,4,5原创 2021-04-08 09:23:16 · 96 阅读 · 0 评论 -
leetcode 81. 搜索旋转排序数组 II
一、题目已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4]原创 2021-04-07 08:32:43 · 220 阅读 · 0 评论 -
leetcode 88. 合并两个有序数组
一、题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]二、解法解法1:使用临时数组+双指针思路:用原创 2021-04-05 10:12:41 · 74 阅读 · 0 评论 -
leetcode 781. 森林中的兔子
一、题目森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。返回森林中兔子的最少数量。示例:输入: answers = [1, 1, 2]输出: 5解释: 两只回答了 “1” 的兔子可能有相同的颜色,设为红色。 之后回答了 “2” 的兔子不会是红色,否则他们的回答会相互矛盾。 设回答了 “2” 的兔子为蓝色。 此外,森林中还应有另外 2只蓝色兔子的回答没有包含在数组中。 因此森林中兔子的最少数量是 5:原创 2021-04-04 10:22:11 · 174 阅读 · 0 评论 -
leetcode 1143. 最长公共子序列
一、题目给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。输入:text1 = “abcde”, text2 = “ace”原创 2021-04-03 13:32:45 · 129 阅读 · 0 评论 -
leetcode 面试题 17.21. 直方图的水量
一、题目给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6二、解法2.1 动态规划思路:在下标为i的地方,实际盛水量=能盛放的最大水量-自身的高度,能盛放的最大水量=下标i左边(包括i)的最大高度和下标i右边(包括i)的最大高度的最小值那么需要得到下标i左边和右边的最大高度,可以用一维数组的简单动态规划,用两个数组 leftMaxleftMaxleftMax 和原创 2021-04-02 17:09:34 · 184 阅读 · 0 评论 -
leetcode 90. 子集 II
一、题目给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。示例:输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]二、代码思路:首先求子集,马上想到用状态压缩的二进制表示,用位运算来求。将集合下标和移位关联起来,比如nums={0,3,3},下标是 0,1,2,位1表示存在,位0表示不存在,则全集为111(2)111_{(原创 2021-03-31 16:07:15 · 71 阅读 · 0 评论 -
leetcode 74. 搜索二维矩阵
一、题目编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。示例1:输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3输出:true示例2:输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13输出:false二、代码思路:原创 2021-03-30 08:37:05 · 108 阅读 · 0 评论 -
leetcode 190. 颠倒二进制位
一、题目颠倒给定的 32 位无符号整数的二进制位。二、代码解法一:思路:逐位颠倒class Solution {public: uint32_t reverseBits(uint32_t n) { uint32_t ans=0; for(int i=0;i<32;++i){ ans|=(n&0x1)<<(31-i); n>>=1; } re原创 2021-03-29 11:31:38 · 118 阅读 · 0 评论 -
leetcode 82. 删除排序链表中的重复元素 II
一、题目给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。输入: 1->2->3->3->4->4->5输出: 1->2->5输入: 1->1->1->2->3输出: 2->3二、代码思路:由于链表是排序的,重复元素一定是相邻排列的。故直接一次遍历即可为了避免头结点的讨论,增加一个虚拟头结点dummy/** * Definition for singly-lin原创 2021-03-25 10:13:34 · 71 阅读 · 0 评论 -
leetcode 456. 132模式
一、题目给定一个整数序列:a1, a2, …, an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。注意:n 的值小于15000。输入: [3, 1, 4, 2]输出: True解释: 序列中有 1 个132模式的子序列: [1, 4, 2].二、代码解法一:单调栈(用first,second,third表示序列中第原创 2021-03-24 18:42:13 · 80 阅读 · 0 评论 -
leetcode 341. 扁平化嵌套列表迭代器
一、题目给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。示例:输入: [1,[4,[6]]]输出: [1,4,6]解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,4,6]。二、代码思路:主要思路就是递归,其实递归就属于一种dfs,将嵌套的列表的数据存于自己定义的vector中题目给的做法是用迭代器原创 2021-03-23 13:34:13 · 90 阅读 · 0 评论 -
leetcode 剑指 Offer 52. 两个链表的第一个公共节点
一、题目输入两个链表,找出它们的第一个公共节点。输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA= 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为[5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点原创 2021-03-21 13:37:14 · 85 阅读 · 0 评论 -
leetcode 73. 矩阵置零
一、题目给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。(直接在原矩阵上面修改)示例:输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]二、代码2.1 解法一:数组记住位置思路:比较常规和简单,即用vector记住所有的0的位置,然后遍历数组即可。空间复杂度:O(mn)(非常愚蠢的解法)2.2 解法二:数组记住行列思路:将0的行和列都用原创 2021-03-21 13:07:39 · 174 阅读 · 0 评论 -
leetcode 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]二、代码思路:首先找到四个节点:prev,succ,leftNode,ri原创 2021-03-18 17:01:09 · 105 阅读 · 0 评论 -
leetcode 206. 反转链表
一、题目反转一个单链表。示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL二、代码思路:cur表示当前节点,prev表示之前节点,next表示cur之后的节点一开始时,cur=head,prev=nullptr(头结点之前没有节点)遍历链表,首先要把next存起来(next=cur->next),然后把cur->next设为prev,然后再更换cur和prev:pr原创 2021-03-18 16:41:37 · 62 阅读 · 0 评论 -
leetcode 1288. 删除被覆盖区间
一、题目给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。在完成所有删除操作后,请你返回列表中剩余区间的数目。示例:输入:intervals = [[1,4],[3,6],[2,8]] 输出:2 解释:区间 [3,6] 被区间 [2,8]覆盖,所以它被删除了。二:代码思路:本题可以使用贪心算法,首先进行排序(开始时间升序排序),并对相同开始时间的区间进行结束时间降序排序原创 2021-03-16 09:09:13 · 142 阅读 · 0 评论 -
leetcode 575. 分糖果
一、题目给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。示例 1:输入: candies = [1,1,2,2,3,3] 输出: 3 解析: 一共有三种种类的糖果,每一种都有两个。最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。二、代码思路:本质是求数组中不同元素的种类数,可以用set,但是由于时间要求,应该用unordere原创 2021-03-15 23:09:37 · 93 阅读 · 0 评论 -
leetcode 54. 螺旋矩阵
一、题目给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]二、代码解法1:递归(时间和空间都比较差)思路:对于一个矩阵(左上角下标是(x1,y1),右下角下标是(x2,y2)),首先求出外层的矩阵的数组,然后递归去求里面一层的矩阵的数组,然后将两者合并即可class Solution {public: vect原创 2021-03-15 16:35:35 · 115 阅读 · 0 评论 -
leetcode 167. 两数之和 II - 输入有序数组
一、题目给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入:numbers = [2,7,11,15], targe原创 2021-03-14 18:54:13 · 139 阅读 · 0 评论 -
leetcode 705. 设计哈希集合
一、题目不使用任何内建的哈希表库设计一个哈希集合(HashSet)。实现 MyHashSet 类:void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。示例:输入:[“MyHashSet”, “add”, “add”, “contains”, “contains”, “add”, “contains”,原创 2021-03-13 11:49:28 · 106 阅读 · 0 评论 -
leetcode 342. 4的幂
一、题目给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x二、代码1. 解法1(常规)class Solution {public: bool isPowerOfFour(int n) { while(n>=4&&n%4==0){ n/=4; } return n==1;原创 2021-03-12 17:12:10 · 85 阅读 · 0 评论 -
leetcode 331. 验证二叉树的前序序列化
一、题目给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 ‘#’ 。你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 “1,3” 。示例1:输入: “9,3,4,#,#,1,#,#,2,#,6,#,#”输出: true示例2:输入: “1,#”输出: false示例3:输入: “9,#,#,1”输出: false二、代码clas原创 2021-03-12 16:38:53 · 141 阅读 · 0 评论 -
leetcode 367. 有效的完全平方数
一、题目给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。说明:不要使用任何内置的库函数,如 sqrt。示例:输入:14输出:False二、代码class Solution {public: bool isPerfectSquare(int num) { if(num==1||num==4) return true; if(num<4) return false;原创 2021-03-11 14:57:57 · 64 阅读 · 0 评论 -
leetcode 227. 基本计算器 II
一、题目1 <= s.length <= 3 * 105s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开s 表示一个 有效表达式表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内题目数据保证答案是一个 32-bit 整数输入:s = “3+2*2”输出:7二、代码class Solution {public: bool isdigit(char ch){ return ch>='0'原创 2021-03-11 11:36:08 · 197 阅读 · 0 评论