每日一练
文章平均质量分 64
Ashen_ffm
这个作者很懒,什么都没留下…
展开
-
Leetcode---685. 冗余连接 II---每日一题---并查集(有向环路问题)
685. 冗余连接 II在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。输入一个有向图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。结果图是一个以边组成的二维数组。 每一个边 的元素是一对 [u, v],用以表示有向图中连接顶点 u 和顶点 v 的边,其中 u 是 v 的一个父节点。返回一条能删除原创 2020-09-17 23:35:16 · 221 阅读 · 0 评论 -
Leetcode---37. 解数独---每日一题---DFS(回溯)
37. 解数独编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。一个数独。答案被标成红色。Note:给定的数独序列只包含数字 1-9 和字符 ‘.’ 。你可以假设给定的数独只有唯一解。给定数独永远是 9x9 形式的。...原创 2020-09-15 13:56:16 · 136 阅读 · 0 评论 -
Leetcode---51. N 皇后---每日一题---DFS(回溯)---复习皇后问题
51. N 皇后n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例:输入: 4输出:[[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,“.Q…”]]解释: 4原创 2020-09-03 10:48:13 · 206 阅读 · 0 评论 -
Leetcode---214. 最短回文串---每日一题---Rabin-Karp
214. 最短回文串给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。示例 1:输入: “aacecaaa”输出: “aaacecaaa”示例 2:输入: “abcd”输出: “dcbabcd”思路我们首先看实例可以看出目标串为原串的前面加上原串的逆序串的一部分,即abcd -> dcba abcd,从中间扩展,我们发现aa回文,可以删除一个。然后通过Rabin-Karp算法来计算逆序和正序的hash值和,当相同时原创 2020-08-29 11:44:06 · 363 阅读 · 0 评论 -
Leetcode---17. 电话号码的字母组合---每日一题---DFS(回溯)
17. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。代码class Solution {public: vector<string> map = {原创 2020-08-26 09:52:37 · 199 阅读 · 0 评论 -
Leetcode---491. 递增子序列---每日一题---DFS(回溯)
491. 递增子序列给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]说明:给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。思路就是直接深度搜索,但是直接搜索,会发现原创 2020-08-25 12:53:24 · 238 阅读 · 0 评论 -
Leetcode---679. 24 点游戏---每日一题---回溯
679. 24 点游戏你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。示例 1:输入: [4, 1, 8, 7]输出: True解释: (8-4) * (7-1) = 24示例 2:输入: [1, 2, 1, 2]输出: False注意:除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1原创 2020-08-22 11:08:19 · 193 阅读 · 0 评论 -
Leetcode---109. 有序链表转换二叉搜索树---每日一题---分治(快慢指针)
109. 有序链表转换二叉搜索树给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:思路 由于链表是没有索引的,所以对于二分的实现有些难以实现,这里我们使用快慢指针的方法可以有效的解决,给快指针调速至慢指针的二倍从而达到getMid的效果从而实现分治。代码/** * Definition for原创 2020-08-18 11:27:48 · 152 阅读 · 0 评论 -
Leetcode---20. 有效的括号---每日一题
20. 有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例 5:输入: “{[]}”输出: tru原创 2020-08-14 10:00:42 · 99 阅读 · 0 评论 -
Leetcode---130. 被围绕的区域---每日一题---DFS
130. 被围绕的区域给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X原创 2020-08-11 10:58:56 · 229 阅读 · 0 评论 -
Leetcode---99. 恢复二叉搜索树---每日一题
99. 恢复二叉搜索树二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?实现代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : va原创 2020-08-08 10:35:16 · 211 阅读 · 0 评论 -
Leetcode---337. 打家劫舍 III---每日一题---树型DP(记忆化DFS)
打家劫舍 III在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。DFS(记忆化)/** * Definition for a binary tree node. * struct T.原创 2020-08-05 10:36:41 · 204 阅读 · 0 评论 -
Leetcode---207. 课程表---每日一题---拓扑排序(DFS)
207. 课程表你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]]输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示例 2:输入: 2, [[1,0],[0,1]]输原创 2020-08-04 14:40:35 · 191 阅读 · 0 评论 -
Leetcode---面试题 08.03. 魔术索引---每日一题---二分查找
面试题 08.03. 魔术索引魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。示例1:输入: nums = [0, 2, 3, 4, 5]输出: 0说明: 0下标的元素为0示例2:输入: nums = [1, 1, 1]输出: 1提示:nums长度在[1, 1000000]之间二分查找cla原创 2020-07-31 10:39:11 · 202 阅读 · 1 评论 -
Leetcode---329. 矩阵中的最长递增路径---每日一题---优先队列
329. 矩阵中的最长递增路径给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例 1:输入: nums =[[9,9,4],[6,6,8],[2,1,1]]输出: 4解释: 最长递增路径为 [1, 2, 6, 9]。示例 2:输入: nums =[[3,4,5],[3,2,6],[2,2,1]]输出: 4解释: 最长递增路径是 [3, 4, 5, 6]。注意原创 2020-07-26 11:08:19 · 132 阅读 · 0 评论 -
Leetcode---410. 分割数组的最大值---每日一题---动态规划 or 二分查找
410. 分割数组的最大值给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。注意:数组长度 n 满足以下条件:1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)示例:输入:nums = [7,2,5,10,8]m = 2输出:18解释:一共有四种方法将nums分割为2个子数组。其中最好的方式是将原创 2020-07-25 11:49:40 · 219 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字---二分查找
剑指 Offer 11. 旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出: 1示例 2:输入:[2,2,2,0,1]输出: 0思路若旋转后,最右边的数字是必然收到牵连的,且必然存在一段递增序列在最右边到左边的某个位置。二分的情况下,左边被旋转原创 2020-07-22 11:12:58 · 127 阅读 · 0 评论 -
Leetcode---95. 不同的二叉搜索树 II---每日一题---递归
95. 不同的二叉搜索树 II给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。示例:输入: 3输出:[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]解释:提示:0 <= n <= 8实现代码/** * Definition for a binary tree node. * struct TreeNode { * int v原创 2020-07-21 11:34:30 · 121 阅读 · 0 评论 -
Leetcode---312. 戳气球---每日一题---记忆化 or 动态规划
312. 戳气球有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。求所能获得硬币的最大数量。说明:你可以假设 nums[-1] = nums[n] = 1,但注意原创 2020-07-19 12:11:00 · 272 阅读 · 0 评论 -
Leetcode---97. 交错字符串---每日一题---动态规划
97. 交错字符串给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。示例 1:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”输出: true示例 2:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”输出: false实现代码class Solution {public: bool isInterleave(string s1, st原创 2020-07-18 12:19:54 · 210 阅读 · 0 评论 -
Leetcode---785. 判断二分图---每日一题---DFS+二分图
785. 判断二分图给定一个无向图graph,当这个图为二分图时返回true。如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。示例 1:输入: [[1,3], [0,2],原创 2020-07-16 11:13:39 · 186 阅读 · 0 评论 -
Leetcode---174. 地下城游戏---每日一题---动态规划
174. 地下城游戏一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则原创 2020-07-12 13:30:22 · 232 阅读 · 0 评论 -
Leetcode---315. 计算右侧小于当前元素的个数---每日一题---树状数组+离散化
315. 计算右侧小于当前元素的个数给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。示例:输入: [5,2,6,1]输出: [2,1,1,0]解释:5 的右侧有 2 个更小的元素 (2 和 1).2 的右侧仅有 1 个更小的元素 (1).6 的右侧有 1 个更小的元素 (1).1 的右侧有 0 个更小的元素.实现代码class BIT {priva原创 2020-07-11 11:28:36 · 142 阅读 · 0 评论 -
Leetcode---309. 最佳买卖股票时机含冷冻期---每日一题---动态规划
309. 最佳买卖股票时机含冷冻期给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]思路分为三个路线推出状态转移方程:持股状原创 2020-07-10 11:19:49 · 241 阅读 · 0 评论 -
Leetcode---面试题 17.13. 恢复空格---每日一题---动态规划+字典树
面试题 17.13. 恢复空格哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。注意原创 2020-07-09 13:20:54 · 182 阅读 · 0 评论 -
Leetcode---63. 不同路径 II---每日一题---动态规划
63. 不同路径 II一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例 1:输入:[[0,0,0],[0,1,0],[0,0,0]]输出: 2解释:3x3 网格的正中间有一个障碍原创 2020-07-06 22:28:50 · 248 阅读 · 0 评论 -
Leetcode---32. 最长有效括号---每日一题
32. 最长有效括号给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”思路 左右各自遍历一次,不使用额外空间,空间复杂度为O(1),时间复杂度为O(n),有一个特别注意的点就是重置计数器,例如:从左原创 2020-07-04 19:07:06 · 122 阅读 · 0 评论 -
Leetcode---108. 将有序数组转换为二叉搜索树---每日一题---分治
108. 将有序数组转换为二叉搜索树将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:思路: 因为是有序数组,使用分治的思路,寻找mid点,然后左右子树的建立使原创 2020-07-03 14:52:00 · 97 阅读 · 0 评论 -
Leetcode---718. 最长重复子数组---每日一题---动态规划
最长重复子数组给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例 1:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3解释:长度最长的公共子数组是 [3, 2, 1]。说明:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100...原创 2020-07-01 10:00:11 · 107 阅读 · 0 评论 -
Leetcode---数组中的逆序对---每日一练6/6
128. 最长连续序列给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。实现代码class Solution {public: int longestConsecutive(vector<int>& nums) { int len = nums.size();原创 2020-06-06 13:53:51 · 193 阅读 · 0 评论