leetcode
葛济维的博客
总想日更博客的小白
展开
-
583. 两个字符串的删除操作(动态规划) - 力扣(LeetCode)
两个字符串的删除操作给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。每步 可以删除任意一个字符串中的一个字符。示例 1:输入: word1 = “sea”, word2 = “eat”输出: 2解释: 第一步将 “sea” 变为 “ea” ,第二步将 "eat "变为 “ea”示例 2:输入:word1 = “leetcode”, word2 = “etco”输出:4提示:1原创 2022-06-01 17:33:37 · 300 阅读 · 0 评论 -
516. 最长回文子序列(动态规划) - 力扣(LeetCode)
最长回文子序列给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例 1:输入:s = “bbbab”输出:4解释:一个可能的最长回文子序列为 “bbbb” 。示例 2:输入:s = “cbbd”输出:2解释:一个可能的最长回文子序列为 “bb” 。集合:dp[i][j]dp[i][j]dp[i][j]表示从 iii 到 jjj 的回文子序列属性:最长的长度集合的划分:按s[i]和s[j原创 2022-06-01 17:20:28 · 292 阅读 · 0 评论 -
322. 零钱兑换 (三种方法,逐步优化时间复杂度)- 力扣(LeetCode)
零钱兑换给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1题解同一个题目的不同种解法使用 Leetcode 组合总和 的思路因为每个硬币都可以选无数次,那么我们可以使用固定的顺序选择硬币遇到原创 2022-05-13 13:27:20 · 645 阅读 · 1 评论 -
518. 零钱兑换 II(记忆化搜索+排序剪枝、DP动态规划) - 力扣(LeetCode)
零钱兑换 II给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。示例 1:输入:amount = 5, coins = [1, 2, 5]输出:4解释:有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1代码AC代码记忆化搜索+排序剪枝class原创 2022-05-13 12:04:08 · 226 阅读 · 0 评论 -
322. 零钱兑换 (记忆化搜索)- 力扣(LeetCode)
零钱兑换给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1记忆化搜索递归树将能凑成当前金额,使用的最少硬币个数记录下来如果重复计算,就直接拿去记忆化数组中的值class Solution原创 2022-05-10 20:28:15 · 240 阅读 · 0 评论 -
416. 分割等和子集(记忆化搜索、DP动态规划) - 力扣(LeetCode)
分割等和子集给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例 1:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。示例 2:输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。题解记忆化搜索dp的思路,但是使用的是记忆化搜索一维是数据下标,二维代表的是到此下标时累加到的和我们用二维数组来记录从此时的原创 2022-05-10 19:50:48 · 206 阅读 · 0 评论 -
18. 四数之和 - 力扣(LeetCode)(双指针、枚举)
四数之和给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0 <= a, b, c, d < na、b、c 和 d 互不相同nums[a] + nums[b] + nums[c] + nums[d] == target你可以按 任意顺序 返回答案 。题解此题和 三数之和 做法思路相似原创 2022-04-27 09:39:50 · 173 阅读 · 0 评论 -
213. 打家劫舍 II - 力扣(LeetCode)
打家劫舍 II你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2),原创 2022-04-07 10:23:16 · 311 阅读 · 0 评论 -
Leetcode 90. 子集 II (dfs搜索)
Leetcode 90. 子集 II给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。示例 1:输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]示例 2:输入:nums = [0]输出:[[],[0]]提示:1 <= nums.length <= 10-10 <= nums[i] <= 10题解原创 2022-04-03 14:39:05 · 225 阅读 · 0 评论 -
572. 另一棵树的子树 - 力扣(LeetCode)(树的哈希)
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。示例 1:输入:root = [3,4,5,1,2], subRoot = [4,1,2]输出:true示例 2:输入:root = [3,4,5,1,2,null,null,null,null,0],原创 2022-04-03 11:47:38 · 619 阅读 · 0 评论 -
Leetcode 1405. 最长快乐字符串(贪心)每日一题
最长快乐字符串如果字符串中不含有任何 ‘aaa’,‘bbb’ 或 ‘ccc’ 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:s 是一个尽可能长的快乐字符串。s 中 最多 有a 个字母 ‘a’、b 个字母 ‘b’、c 个字母 ‘c’ 。s 中只含有 ‘a’、‘b’ 、‘c’ 三种字母。如果不存在这样的字符串 s ,请返回一个空字符串 “”。示例 1:输入:a = 1, b = 1, c = 7输出:“c原创 2022-02-07 09:19:57 · 131 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值(滑动窗口、单调队列)
剑指 Offer 59 - I. 滑动窗口的最大值给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7原创 2022-01-29 15:25:01 · 816 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串(分类讨论)
剑指 Offer 20. 表示数值的字符串请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。数值(按顺序)可以分成以下几个部分:若干空格一个 小数 或者 整数(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数若干空格小数(按顺序)可以分成以下几个部分:(可选)一个符号字符(’+’ 或 ‘-’)下述格式之一:至少一位数字,后面跟着一个点 ‘.’至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字一个点 ‘.’ ,后面跟着至少一位数字整数(按顺序)可以分成以下几原创 2022-01-29 14:07:01 · 91 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2提示:a, b 均可能是负数或 0结果不会溢出 32 位整数题解先枚举每种情况ab本位进位0000011010101101本位 a ^ b进位 a & b代码:class Solution {public:原创 2022-01-28 12:47:20 · 5425 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数(位运算题解)
剑指 Offer 56 - I. 数组中数字出现的次数一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]限制:2 <= nums.length <= 10000题解先求出两个只出现一次的数字的异或和原创 2022-01-26 19:54:19 · 372 阅读 · 0 评论 -
Leetcode 215. 数组中的第K个最大元素 (手写快速排序)
Leetcode 215. 数组中的第K个最大元素给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4题解改造快速排序的算法,求得第 k 大的数class Solution {public: int quick_sort(vec原创 2022-01-18 11:26:28 · 153 阅读 · 0 评论 -
Leetcode 81. 搜索旋转排序数组 II(二分法)
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原创 2022-01-18 10:20:03 · 92 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径 (DFS深度优先搜索、回溯法)
剑指 Offer 12. 矩阵中的路径给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。示例 1:输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”原创 2022-01-16 14:23:47 · 167 阅读 · 0 评论 -
两种方法实现求链表的环开始的结点(快慢指针、哈希表)—— leetcode 142. 环形链表 II
leetcode 142. 环形链表 II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。示例 1:输入:head = [3,2,0,-4], pos =原创 2022-01-15 12:53:03 · 221 阅读 · 0 评论 -
从给定原材料中找到所有可以做出的菜(拓扑排序)——leetcode 第 68 场双周赛
从给定原材料中找到所有可以做出的菜你有 n 道不同菜的信息。给你一个字符串数组 recipes 和一个二维字符串数组 ingredients 。第 i 道菜的名字为 recipes[i] ,如果你有它 所有 的原材料 ingredients[i] ,那么你可以 做出 这道菜。一道菜的原材料可能是 另一道 菜,也就是说 ingredients[i] 可能包含 recipes 中另一个字符串。同时给你一个字符串数组 supplies ,它包含你初始时拥有的所有原材料,每一种原材料你都有无限多。请你返回你可原创 2021-12-26 21:00:22 · 276 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串【双指针】
剑指 Offer 48. 最长不含重复字符的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子原创 2021-12-23 11:47:08 · 153 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串 【动态规划】
剑指 Offer 46. 把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”提示:0 <= num < 231动态规划class原创 2021-12-23 11:19:10 · 79 阅读 · 0 评论 -
斐波拉契数列一题多解【递归】【迭代】【动态规划】三种做法
剑指 Offer 10- I. 斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示原创 2021-12-22 23:05:33 · 909 阅读 · 0 评论 -
剑指 Offer 24. 反转链表(迭代、递归两种解法)
剑指 Offer 24. 反转链表定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000两种方法题解迭代方法/** * Definition for singly-linked list. * struct ListNode { * int val;原创 2021-12-07 22:05:24 · 80 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表(三种方法 递归、栈、链表)
剑指 Offer 06. 从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000三种方法题解递归:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(i原创 2021-12-05 19:52:45 · 508 阅读 · 0 评论 -
leetcode 第 270 场周赛(找出 3 位偶数、删除链表的中间节点、从二叉树一个节点到另一个节点每一步的方向)
5942 找出 3 位偶数给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。你需要找出 所有 满足下述条件且 互不相同 的整数:该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。该整数不含 前导零该整数是一个 偶数例如,给定的 digits 是 [1, 2, 3] ,整数 132 和 312 满足上面列出的全部条件。将找出的所有互不相同的整数按 递增顺序 排列,并以数组形式返回。示例 1:输入:digits = [2,1,3原创 2021-12-05 15:59:37 · 168 阅读 · 0 评论 -
从数组中移除最大值和最小值(困难题、并查集)————leetcode 第 269 场周赛
2092. 找出知晓秘密的所有专家给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号。另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meetings[i] = [xi, yi, timei] 表示专家 xi 和专家 yi 在时间 timei 要开一场会。一个专家可以同时参加 多场会议 。最后,给你一个整数 firstPerson 。专家 0 有一个 秘密 ,最初,他在时间 0 将这个秘密分享给了专家 firstPerson 。接着,这个秘密会在每次有知晓这个秘密的原创 2021-12-01 22:16:00 · 189 阅读 · 0 评论 -
leetcode第 269 场周赛————2091. 从数组中移除最大值和最小值
从数组中移除最大值和最小值给你一个下标从 0 开始的数组 nums ,数组由若干 互不相同 的整数组成。nums 中有一个值最小的元素和一个值最大的元素。分别称为 最小值 和 最大值 。你的目标是从数组中移除这两个元素。一次 删除 操作定义为从数组的 前面 移除一个元素或从数组的 后面 移除一个元素。返回将数组中最小值和最大值 都 移除需要的最小删除次数。示例 1:输入:nums = [2,10,7,5,4,1,8,6]输出:5解释:数组中的最小元素是 nums[5] ,值为 1 。数组原创 2021-12-01 20:22:50 · 189 阅读 · 0 评论 -
leetcode 第 269 场周赛 ——2090. 半径为 k 的子数组平均值
给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k 。半径为 k 的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值,即下标在 i - k 和 i + k 范围(含 i - k 和 i + k)内所有元素的平均值。如果在下标 i 前或后不足 k 个元素,那么 半径为 k 的子数组平均值 是 -1 。构建并返回一个长度为 n 的数组 avgs ,其中 avgs[i] 是以下标 i 为中心的子数组的 半径为 k 的子数组原创 2021-12-01 19:44:50 · 157 阅读 · 0 评论 -
2080. 区间内查询数字的频率————leetcode第 268 场周赛
请你设计一个数据结构,它能求出给定子数组内一个给定值的 频率 。子数组中一个值的 频率 指的是这个子数组中这个值的出现次数。请你实现 RangeFreqQuery 类:RangeFreqQuery(int[] arr) 用下标从 0 开始的整数数组 arr 构造一个类的实例。int query(int left, int right, int value) 返回子数组 arr[left…right] 中 value 的 频率 。一个 子数组 指的是数组中一段连续的元素。arr[left…right原创 2021-11-27 15:58:23 · 180 阅读 · 0 评论