- 博客(28)
- 收藏
- 关注
原创 Leetcode_颜色分类
Leetcode_颜色分类题目题解题目给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 题解思路:双指针交换元素。 void sortColors(vector<int>& nums) { int i = 0, j = nums.size() - 1; for(int k = 0; k <= j; k
2021-09-21 17:15:09
171
1
原创 Leetcode_解码方法
Leetcode_解码方法题目题解题目一条包含字母 A-Z 的消息通过以下映射进行了 编码 :'A' -> 1'B' -> 2...'Z' -> 26要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:"AAJF" ,将消息分组为 (1 1 10 6)"KJF" ,将消息分组为 (11 10 6)注意,消息不能分组为 (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6"
2021-09-21 17:01:59
212
1
原创 Leetcode_最后一个单词的长度
Leetcode_最后一个单词的长度题目题解题目给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 题解思路:直接倒序遍历排除开头空格。class Solution {public: int lengthOfLastWord(string s) { int count = 0; if(s.size() == 1) return 1; //
2021-09-21 13:56:47
123
原创 Leetcode_数组中的第k个最大元素
Leetcode_数组中的第k个最大元素题目题解题目给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 题解 思路1:直接调用 sort() 函数排序,然后返回第 k 大的元素。class Solution {public: int findKthLargest(vector<int>& nums, int k) { sort
2021-09-21 13:45:57
288
原创 Leetcode_二叉树展开为链表
Leetcode_二叉树展开为链表题目题解题目给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 题解 思路1:先序遍历记录结点,然后按照记录的结点调整树的结构。class Solution {public: void flatten(TreeNode* root) {
2021-09-16 16:02:06
151
原创 Leetcode_有效的括号字符串
Leetcode_有效的括号字符串题目题解题目给定一个只包含三种字符的字符串:( , ) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:任何左括号 ( 必须有相应的右括号 )。任何右括号 ) 必须有相应的左括号 ( 。左括号 ( 必须在对应的右括号之前 )。* 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。一个空字符串也被视为有效字符串。 :题解思路1:dp考虑一串字符为有效括号串的情况:字符串的头尾能构成一对()
2021-09-14 15:55:46
263
原创 Leetcode_找到需要补充粉笔的学生编号
Leetcode_找到需要补充粉笔的学生编号题目题解题目一个班级里有 n 个学生,编号为 0 到 n - 1 。每个学生会依次回答问题,编号为 0 的学生先回答,然后是编号为 1 的学生,以此类推,直到编号为 n - 1 的学生,然后老师会重复这个过程,重新从编号为 0 的学生开始回答问题。给你一个长度为 n 且下标从 0 开始的整数数组 chalk 和一个整数 k 。一开始粉笔盒里总共有 k 支粉笔。当编号为 i 的学生回答问题时,他会消耗 chalk[i] 支粉笔。如果剩余粉笔数量 严格小于 ch
2021-09-12 16:40:57
127
原创 Leetcode_IPO
Leetcode_IPO题目题解题目假设 力扣(LeetCode)即将开始其 IPO。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k 个不同项目后得到最大总资本的方式。给定若干个项目。对于每个项目 i,它都有一个纯利润 Pi,并且需要最小的资本 Ci 来启动相应的项目。最初,你有 W 资本。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。总而言
2021-09-09 23:38:06
111
原创 Leetcode_最长有效括号
Leetcode_最长有效括号题目题解题目给你一个只包含'('和')'的字符串,找出最长有效(格式正确且连续)括号子串的长度。 题解思路:一维数组dp。主要考虑延长有效括号串情况。若s[i]为'(',那么无法与前一段有效括号串进行组合,无法延长,因此dp[i]置为0。若s[i]为')',考虑三种情况:一是在前一段有效括号串后增加一对括号,二是和一个'('括住一段有效括号串,三是无法进行组合。尤其注意第二种情况,若与之匹配的'('与另一段有效括号串相邻(如:(()())(())的情况
2021-09-08 00:28:00
102
原创 Leetcode_三数之和
Leetcode_三数之和题目题解题目给你一个包含n个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。 题解思路:固定第一个数,对第二、三个数求“两数之和”。vector<vector<int>> threeSum(vector<int>& nums) { if(nums.size() < 3) //
2021-09-02 23:31:17
65
原创 Leetcode_链表中倒数第k个节点
Leetcode_链表中倒数第k个节点题目题解题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。 题解 思路1:先遍历计数再从头走size - k步,复杂度为O(2n - k)ListNode* getKthFromEnd(ListNode* head, int k) { List
2021-09-02 17:57:52
89
原创 Leetcode_分裂二叉树的最大乘积
Leetcode_分裂二叉树的最大乘积题目题解题目给你一棵二叉树,它的根为root。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。由于答案可能会很大,请你将结果对 10^9 + 7 取模后再返回。 题解 思路:随意删除一条边,二叉树会分裂成某个结点的子树 + 剩下的部分。因此只需要递归求得所有的子树的结点和即可。int maxProduct(TreeNode* root) { vector<int> sum; getsu
2021-09-02 17:22:20
116
原创 Leetcode_二叉树的后序遍历
Leetcode_二叉树的后序遍历题目题解题目给定一个二叉树,返回它的后序遍历。 题解递归版本很简单,在此跳过。令人头疼的迭代版本: vector<int> postorderTraversal(TreeNode* root) { if(root == nullptr) return {}; vector<int> num; stack<TreeNode*> s; TreeNode* prev;
2021-09-02 15:16:35
112
原创 Leetcode_比较版本号
Leetcode_比较版本号题目题解题目给你两个版本号version1和version2,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个'.'连接。每个修订号由多位数字组成,可能包含前导零。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0,下一个修订号下标为 1,以此类推。例如,2.5.33和0.1都是有效的版本号。比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值。也就是说,修订号1和修订号00
2021-09-01 21:28:46
208
原创 Leetcode_不同的二叉搜索树II
Leetcode_不同的二叉搜索树II题目题解题目给你一个整数n,请你生成并返回所有由n个节点组成且节点值从1到n互不相同的不同二叉搜索树。可以按任意顺序返回答案。 题解和上一题的思路类似。采用递归的方法分治得到两侧子树的所有情况。主要注意返回条件和递归参数。vector<TreeNode*> GenerateTrees(int start, int end) { if(start > end) return {nullptr}
2021-09-01 16:44:37
70
原创 Leetcode_不同的二叉搜索树
Leetcode_不同的二叉搜索树题目题解题目给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。 题解思路:dp时间到!注意到二叉搜索树的性质使得当[1, n]中的某一个数m为根的时候,根的两侧分别为[1, m - 1],[m + 1, n]。两侧都是连续的数字,且数量小于n,满足dp性质。所以从n = 0, 1的时候开始构建。对每一棵结点数固定的二叉搜索树,分别考虑[1, n]中每一个数为根的情况进行累加。int numT
2021-08-31 22:44:02
95
原创 Leetcode_二叉树的中序遍历
Leetcode_二叉树的中序遍历题目题解题目给定一个二叉树的根节点root,返回它的中序遍历。 题解迭代速度>递归。vector<int> inorderTraversal(TreeNode* root) { vector<int> ans; if(root == nullptr) return ans; stack<TreeNode*> s; while(!s.empty() || root
2021-08-31 16:44:35
121
原创 Leetcode_航班预定统计
Leetcode_航班预定统计题目题解题目这里有n个航班,它们分别从1到n进行编号。有一份航班预订表bookings,表中第i条预订记录bookings[i] = [first i, last i, seats i]意味着在从first i到last i(包含first i和last i)的 每个航班 上预订了seats i个座位。请你返回一个长度为n的数组answer,其中answer[i]是航班i上预订的座位总数。题解上来就暴力解结果超时。= =思路:利用差分数组,由原数组每个元素减去前一
2021-08-31 15:56:53
117
原创 Leetcode_移除元素
Leetcode_移除元素题目题解题目给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 题解遇事不决双指针int removeElement(vector<int>& nums, int val) {int slow_index = 0; for(int fast_in
2021-08-30 23:53:23
112
原创 Leetcode_括号生成
Leetcode_括号生成题目题解题目数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。有效括号组合需满足:左括号必须以正确的顺序闭合。 题解对dp有了新的认识(并不是所有dp都要建矩阵.jpg),执着于建矩阵最后还是没想出来,参考了两位大佬的解答。 思路1:向上一级,即n-1个括号的合法组合中插入完整的"()",以得到n个括号的合法组合。递归得到所有组合后通过unordered_map去重。vector<string>
2021-08-30 22:34:19
68
原创 Leetcode_按权重随机选择
Leetcode_按权重随机选择题目题解题目给定一个正整数数组w,其中w[i]代表下标i的权重(下标从0开始),请写一个函数pickIndex,它可以随机地获取下标i,选取下标i的概率与w[i]成正比。例如,对于w = [1, 3],挑选下标0的概率为1 / (1 + 3) = 0.25(即,25%),而选取下标1的概率为3 / (1 + 3) = 0.75(即,75%)。也就是说,选取下标i的概率为w[i] / sum(w)。 题解思路:对w的元素值进行前缀求和得到sum,利用ra
2021-08-30 15:53:12
249
原创 Leetcode_盛最多水的容器
Leetcode_盛最多水的容器题目题解题目给你n个非负整数a1,a2,...,an,每个数代表坐标中的一个点(i, ai)。在坐标内画n条垂直线,垂直线i的两个端点分别为(i, ai)和(i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。 题解思路:一开始试图O(n^2)暴力求解结果超时,借鉴大佬的解题思路优化到O(n)。考虑如何一次遍历“板”,主要思路为锁定两块板(初始化为最小和最大索引),其中的短板(可能不断切换)向内移动寻找更长的
2021-08-30 14:44:43
41
原创 Leetcode_字符串转换整数
Leetcode_字符串转换整数题目题解题目请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的atoi函数)。函数myAtoi(string s)的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这
2021-08-30 10:21:56
83
原创 Leetcode_整数反转
Leetcode_整数反转题目题解题目给你一个 32 位的有符号整数x ,返回将x中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围[−231, 231 − 1],就返回 0。假设环境不允许存储 64 位整数(有符号或无符号) 题解由于要求返回int类型,因此直接使用新变量y(而非字符数组)进行运算。注意:整数的最大值和最小值可以使用宏定义INT_MAX和INT_MIN表示。int reverse(int x) { int y = 0;
2021-08-29 17:07:21
87
原创 Leetcode_正则表达式匹配
Leetcode_正则表达式匹配题目动态规划方法题目给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.'匹配任意单个字符'*'匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。 动态规划方法建立矩阵matrix记录匹配状态,matrix[i + 1][j + 1]表示字符规律p中前i个字符能否与s中的前j个字符相匹配。这里将带'*'的字符和'*'视作一个整体,即在matrix中的状态行相同。思路
2021-08-28 15:36:30
120
原创 Leetcode_无重复字符的最长子串
Leetcode_无重复字符的最长子串题目滑动窗口方法hash map优化(?)题目给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例2输入: s = " "输出: 0滑动窗口方法int lengthOfLongestSubstring(string s) { int max = 0, len = 0, start =
2021-01-23 19:47:53
71
原创 Leetcode_两数之和2
Leetcode_两数之和2题目题解题目给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.[注意]:l1和l2的长度可能不同。链表结构:Definition for singly-linked list
2021-01-22 17:06:12
86
原创 Leetcode_两数之和
Leetcode_两数之和题目暴力解法哈希表解法插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。暴力解法哈希表解法何改变文本的样式强调文本 强调文本加粗文本
2021-01-21 19:18:37
66
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人