自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 拓扑排序-LeetCode210.课程表II

先看一下百度百科对于拓扑排序的定义:简单来说就是在一个有向无环图中寻找一个序列,这个序列包含所有节点,可以线性的一次遍历完所有的节点,这样的序列我们称之为拓扑序列,寻找拓扑队列的过程就是拓扑排序。通过这道题目我们了解一下拓扑排序的两种实现方式-(dfs&bfs)(解本题的基本思路就是将已知条件转换为图的数据结构,意识到所求结果就是图中的拓扑序列,通过拓扑排序进行寻找。)LeetCode210. 课程表 II先看一下相对简单的BFS思路:对于一个拓扑序列,起点一定是一个没有任何入边的节点

2021-11-17 21:52:36 198

原创 2020-11-17 LeetCode318-最大单词长度乘积(每日一题)

虽然我当时只想出极致的暴力,但是看完答案我还是想说这题并不难。专门来写一篇博客主要是因为第一次接触位掩码的思想,想记录一下。在我的理解中,位掩码类似于一个枚举数组,数字的每一位等价于数组的索引,对于每一位用0/1标志一个变量的两种属性如本题中表示该字母是否有出现。我们初始化一个数字mask为0,通过mask|=1<<(位数),将我们需要标记的位置为1,当我们在寻找两个完全不同的mask时可以通过&运算判断结果是否==0,就很方便~目前看,位掩码可以用来作为元素比较前的预处理,实际开

2021-11-17 12:02:17 124

原创 进阶刷题-BFS(更新中)

BFS的核心思想形象地将就是当面对岔路口时我们要每个都进去走一步,重点在于保存每个路口。一般用到队列的数据结构,使用其先进先出的特性。LeetCode102-二叉树的层序遍历 Middleclass Solution{public: vector<vector<int>> levelOrder(TreeNode *root) { queue<TreeNode *> q; //保存树的节点 vector<vec

2021-11-10 00:35:36 270

原创 2021-11-03 每日一题延展-接雨水姊妹题

LeetCode42-接雨水I解题思路:对于每个点接雨水的量都取决于两侧最高柱子的高度,我们至于要两次遍历,求出每个点对应左右侧最高的柱子保存起来,就可以通过这两个数组直接求出各点接水量。class Solution {public://动态规划 int trap(vector<int>& height) {//对于每个点保存它左右的最大值,遍历数组计算每个点储水量 int n=height.size(),res=0; vector<i

2021-11-03 14:49:17 103

原创 2021-10-26 每日一题延展-单调栈姊妹题

LeetCode496-下一个更大元素I很喜欢评论中的一句话:解题思路参考自官方题解class Solution{public: vector<int> nextGreaterElement(vector<int> &nums1, vector<int> &nums2) { map<int, int> hash; //哈希表保存每个元素的结果 stack<int> stk;

2021-10-29 11:22:23 49

原创 2021-10-25 LeetCode240-搜索二维矩阵II(每日一题)

解法一:二分查找法根据每行都是有序数列的特点,对每行进行二分查找时间复杂度:O(mlog⁡n)空间复杂度:O(1)class Solution{public: bool searchMatrix(vector<vector<int>> &matrix, int target) { for (auto &temp : matrix) { if (temp[0] > target)

2021-10-25 10:37:40 74

原创 2021-10-24 LeetCode638-大礼包(每日一题)

总的思路就是记忆化搜索+动态规划,对于每个礼包我选择买或不买一个,如果买了就更新需求列表,递归的对新需求进行每个礼包的选择。我们还可以对礼包进行预处理,排除掉不合适或者无意义的礼包,减少计算量。注意点:本题如果用贪心的思想考虑会出问题,如例:[6,3][[3,2,9],[1,2,1],[0,1,5],[2,5,9]][6,6]因为按照贪心思想,当前礼包合适我们就尽可能的多买当前礼包,然后继续考虑其他,但是这样不能得到最优解,即无法证明贪心法的正确性。编程实现参考自官方题解class Sol

2021-10-24 15:57:56 1453

原创 进阶刷题-DFS

LeetCode98-验证二叉搜索树解法一:根据二叉搜索树的特性可知,其中序遍历结果为一个递增数组,我们可以中序遍历二叉树,同时检查新保存的数据是否满足递增。(注意在便利的同时就可以进行判断,这样节省掉额外遍历结果数组的时间)class Solution{public: bool isValidBST(TreeNode *root) { vector<int> nums; stack<TreeNode* > stk;

2021-10-23 10:27:20 112

原创 2021-10-22 LeetCode229-求众数II(每日一题)

常规思路是遍历数组,使用哈希表存储各个数字出现的次数,很容易求出结果。但是时空复杂度都为O(n),不满足本题的额外要求。优化解法参考自官方题解优化解法:摩尔投票法摩尔投票法的核心就是四个字“对拼内耗”,我们通过不同元素的对拼内耗,不断消耗数组内元素,根据我们寻找众数的条件,选择不同规模的对拼内耗,如果存在满足条件的众数,那么一定是在对拼内耗中存活下来的。我们只需要重新遍历一遍数组,幸存的元素统计数量判断是否满足要求就好。在本题中,我们寻找数量大于n/3的数字,易知最多存在两个元素满足条件,那我们选择

2021-10-22 10:59:50 76

原创 2021-10-21 LeetCode66-加一(每日一题)

简单题本来不想写题解了,但是做的时候发现一个有趣的点,记录一下~解题思路是从后往前遍历,使用了迭代器,同时用carry变量记录进位,当加以后整个位数也加一时就在vector首插入一个1就好了。有趣的点是第一遍写完提交显示结果不对,检查一遍发现是有进位时,下一位没有加进位,于是找到了代码中的问题在于:vector.rbegin()虽然返回的尾部元素位置,但是由此位置到vector.rend()使用的是itor++的操作,也就是说是逻辑上的从首遍历到尾,而从索引上看是从尾减到首。class Soluti

2021-10-21 09:06:47 63

原创 2021-10-18 路径总和I+II+III

部分解题思路参考自LeetCode对应题目官方题解LeetCode112-路径总和I基础DFS,能优化的就是代码的简洁和美观了~class Solution{public: bool hasPathSum(TreeNode *root, int targetSum) { if (!root) return false; if (!root->right && !root->left)

2021-10-18 14:50:42 117

原创 二叉树的中序遍历(三种解法)

中序遍历-三种解法LeetCode94-二叉树的中序遍历解法三参考自官方题解解法一:递归基础解法,很容易想到,也很好写。时空复杂度均为O(n)class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> res; root0(res,root); return res; } void ro

2021-10-15 10:33:39 710

原创 2021-10-11 LeetCode273-整数转换英文表示(每日一题)

题目没啥难点,就是心细点,把细节考虑到就好了,也没啥亮点。。。打卡~class Solution{public: string numberToWords(int num) { string res; if (!num) return "Zero"; map<int, string> Table = { {1000000000, "Billion "},

2021-10-11 10:26:11 88

原创 2021-10-10 LeetCode441-排列硬币(每日一题)

题目所给阶梯状的排列方式为等差数列,我们可以很轻易的计算出不同的阶梯行数排满对应的硬币总数,我最开始的想法就是让K自增,同时比较当前K对应的硬币总数与题给N的大小,可以很轻松找出结果。但是显然时间效率很低,上代码!class Solution{public: int arrangeCoins(int n) { long long sum = 1, k = 1; //long long防止数据溢出 if (n == 0) ret

2021-10-10 08:49:24 80

原创 进阶刷题-哈希表

哈希表可以同时保存关键字以及关键字的另一个信息,可以是value用于记录数量,也可以是position用于查找地址,当需要同时考虑关键字以及其另一个关键信息是可以考虑使用哈希表相关的数据结构LeetCode30-串联所有单词的子串-hard因为题目所给words中可以存在重复的单词,所以我们选择可以同时储存key与value的哈希表用于保存于核验。再加上子串长度为words内所有单词总长,固定不变的长度加上遍历很容易联想到滑动窗口。所以总思路为滑动窗口+哈希表数据结构。我们先将words存储在一个ha

2021-10-09 21:05:04 146

原创 2021-10-08 LeetCode187-重复的DNA序列(每日一题)

题目并不难,很容易想到遍历并用哈希表保存,只不过要注意在细节处可以对代码进行优化!打卡打卡!class Solution{public: vector<string> findRepeatedDnaSequences(string s) { map<string, int> hash; string temp; vector<string> res; for (int i = 0; i

2021-10-08 10:24:11 108

原创 进阶刷题——堆与堆排序

刷题之前让我们先来好好了解一下堆这个数据结构以及堆排序的算法实现!堆:堆是具有如下性质的完全二叉树-每个节点的值都大于或等于左右孩子节点的值,称为大顶堆;每个结点的值都小于等于其左右孩子结点的值,称为小顶堆。(我们只是以数组的形式操作保存二叉树)堆排序:将当前数组构造成为一个大顶堆。重复地将堆顶元素与当前大顶堆最后一个节点叫唤并排除交换来的尾节点,并对前面的n-1个元素重新排列构造为新的大顶堆。反复执行的结果就是一个升序地有序序列。HeapAdjust函数用于构造大顶堆。两个int类型的参数规定堆的范围

2021-10-07 14:43:54 107

原创 2021-10-07 LeetCode434-字符串中的单词数(每日一题)

感谢今日一题给我增强信心hhhh打卡打卡!class Solution{public: int countSegments(string s) { int len = s.size(), cnt = 0; for (int i = 0; i < len; i++) { if ((i == 0 || s[i - 1] == ' ') && s[i] != ' ') //

2021-10-07 08:40:33 59

原创 2021-10-06 LeetCode414-第三大的数(每日一题)

题目很简单,看了一遍思路就出来了,编程也没什么难度。无非就是用遍历一次寻找最大值的方法引申增加两个变量用于保存第二大与第三大的值,注意排除掉相等时的数值。class Solution{public: int thirdMax(vector<int> &nums) { long f = -__LONG_MAX__, s = -__LONG_MAX__, t = -__LONG_MAX__; //分别用三个变量保存最大的三个值

2021-10-06 08:27:33 70

原创 美团2021校招真题002-小美的仓库整理

先附上自己最开始写的版本,思路就是暴力遍历时间复杂度O(n^2)理所当然的超时了QWQ#include <iostream>#include <vector>#include <stack>#include <string>#include <time.h>#include <queue>#include <cstring>#include <set>#include <map>

2021-10-05 11:06:40 288

原创 2021-09-29 LeetCode517-超级洗衣机(每日一题)

它甚至让我遗忘了洗衣机里洗好的衣服!看了两个题解花了好久时间弄懂的困难题,虽然数学证明我还是不明白,但是原理已经弄懂了T-T可太难了(我是笨蛋第一种解法参考官方题解class Solution{public: int findMinMoves(vector<int> &machines) { int tot = accumulate(machines.begin(), machines.end(), 0); int n = mac

2021-09-29 23:53:44 69

原创 2021-09-28 LeetCode173-路经总和III(每日一题)

两种方法都是参考了题解,看完自己写一遍弄明白,今日状态极差(我是FW)有时间会回头做这一系列前面两道题 打卡!第一种解法:穷举+dfsclass Solution{public: int rootSum(TreeNode *root, int targetSum)//对于某一起点dfs寻找其中是否存在满足条件的路径 { if (!root) return 0; int res = 0; if (root->

2021-09-28 23:05:24 54

原创 2021-09-27 LeetCode639解码方法II(每日一题)

今天每日一题直接看大概想到了递归,但是思路不明确,于是返回去看了本题的进阶来源-LeetCode91-解码方法先从低阶题目看起LeetCode91-解码方法:思路就是对于每个数字都分两种情况讨论,即自己单独或与前一位组合。class Solution {public: int numDecodings(string s) { int n = s.size(); if(s[0]=='0') return 0; vector<int>

2021-09-27 11:13:27 108

原创 2021-09-26 LeetCode371-两整数之和(每日一题)

很容易想到使用位运算,但是很遗憾我偏偏对这个就不太熟悉。。。参考的题解加了注释T-T算法思路借鉴于官方题解,添加了详细注释用于理解,刷题打卡class Solution{public: int getSum(int a, int b) { unsigned int carry; //unsigned用于防止溢出 while (b != 0) { carry = (unsigned int)(a & b)

2021-09-26 19:54:29 26

原创 2021-09-25 LeetCode583-两个字符串的删除操作(每日一题)

拿到题第一时间想到了应用动态规划,但是因为没做过最长相同子序列类题目,没有成功想到具体实现解出。转头去做了1143.最长公共子序列,了解了二维dp数组的应用,回头看本题发现本质上是一样的,很容易就解出。打卡打卡!常规做法,dp储存最长子序列长度。class Solution {public: int minDistance(string word1, string word2) { int m = word1.size(), n = word2.size();

2021-09-25 09:23:23 38

原创 2021-09-24 LeetCode430-扁平化多级双向链表(每日一题)

总的思路为碰到拥有子项的节点入栈,向下遍历子链表,将子链表结尾与栈顶下一节点连接,然后返回向后遍历上层链表,同时注意断开多余的连接。碰到特殊情况如[1,null,2,null,3,null]时,需要采用另一种方法,即实时连接当前节点与子链表当前节点,如果按照之前的思路遍历到最深处返回连接会出错!第一次完全不看题解做出来,且完全可以接受,嘿嘿嘿。(一会再去看看题解优化一下代码~)打卡打卡!// Definition for a Node.class Node {public: int val

2021-09-24 13:07:45 44

原创 2021-09-23 LeetCode326-3的幂(每日一题)

没想到今天居然是简单题,看到题目一瞬间就想出了常规解法就是循环除,甚至一度觉得这个解法是不是会超时…或者哪里有个坑,最终发现简单题实至名归。。。打卡打卡!常规解法:class Solution{public: bool isPowerOfThree(int n) { if (n <= 0) return false; while (n != 1) { if (n % 3 != 0)

2021-09-23 16:46:01 43

原创 2021-09-22 LeetCode725-分隔链表(每日一题)

刚开始题目没仔细看以为是间隔的放在一组,白写了一串代码,甚至还通过了二十几个测试样例…重新看题之后思路很快就出来了,但是想了想能否只遍历一次,结果是没有想到什么好方法,按照常规方法写出来代码第一遍交错误,因为第一次遍历统计数量结束忘记重置指针至头节点了,改正后一遍过,思路和题解也是一样的。打卡打卡!class Solution{public: vector<ListNode *> splitListToParts(ListNode *head, int k) {

2021-09-22 19:08:04 43

原创 进阶刷题-贪心

笔者将在LeetCode题库中由浅入深理解编写贪心思想相关题目并不断更新自己对该算法的理解与思考理解与思考:贪心在某种意义上可以借鉴动态规划的思想,但是在求各个状态的过程中可以通过贪心的思想将状态分组,关注的是每组状态中贪心思想选择的最优解刷题过程中算法思路借鉴于官方题解,添加了详细注释用于理解LeetCode45-跳跃游戏 II本题的贪心思想某种程度上和递归的思路非常相似,相同处在于计算每一状态的相关参数,不同处在于本题是在一定范围内贪心的保存最优解,并且通过保存的参数影响后续的状态转移。cla

2021-09-21 22:55:02 48

原创 2021-09-21 LeetCode58-最后一个单词的长度(每日一题)

题目简单得很,不愧是简单题,没啥能说的,就是自己笨写的代码比较冗长T-T,日常打个卡吧class Solution{public: int lengthOfLastWord(string s)//自己写的 { int n = s.size(), r = n - 1, l = r; if (n == 1) { if (s[0] == ' ') return 0;

2021-09-21 13:23:49 37

原创 2021-09-20 LeetCode673-最长递增子序列的个数(每日一题)

算法思路借鉴于官方题解,添加了详细注释用于理解,刷题打卡看过一遍题目就想到了动态规划的思想,也想到了用pair储存两个状态,但是具体实现时初始化的{0,1}导致很多示例过不去,写的非常繁琐,最终还是看了眼题解T_T本来今天想结束动态规划的联系了的,没想到每日一题就是dp,我还没写出来TTTTTT_TTTTTTTclass Solution{public: int findNumberOfLIS(vector<int> &nums) { int n

2021-09-20 10:42:33 49

原创 2021-09-19 LeetCode650-只有两个键的键盘(每日一题)

第一种思路是动态规划,也是我看到这道题的第一时间考虑到的解法,但是当时想的是记录每个步数最多能输出多少A,考虑了一会发现想歪了,题目求的是最少以及“恰好”,最多步数明显不是正确解,看了眼题解发现自己相反了T_T,思路对了代码就很好写了~class Solution{public: int minSteps(int n) { //动态规划,状态定义为每个数字需要的最少步数 vector<int> dp(n + 1); dp[1] = 0;

2021-09-19 19:35:52 93

原创 2021-09-10 LeetCode1894-找到需要补充粉笔的学生编号(每日一题)

算法思路借鉴于官方题解,添加了详细注释用于理解,刷题打卡感觉这题也就是个easy难度,没什么特殊的地方class Solution{public: int chalkReplacer(vector<int> &chalk, int k) { int sum = 0, res, i; //如果把sum定义为longlong那就不用考虑溢出了 for (i = 0; i < chalk.size(); i++) {

2021-09-10 10:29:51 53

原创 2021-09-09 LeetCode68-文本左右对齐(每日一题)

一看到是困难题是有点害怕的,但是思路想到了,实际上就是分情况讨论,难点也就是一些小细节比如区间的设定,包括两个功能函数的实现,但是我偷懒直接用了0.0class Solution { // blank 返回长度为 n 的由空格组成的字符串 string blank(int n) { return string(n, ' '); } // join 返回用 sep 拼接 [left, right) 范围内的 words 组成的字符串 string j

2021-09-09 11:23:24 52

原创 2021-09-08 LeetCode-502(每日一题)

算法思路借鉴于官方题解,添加了详细注释用于理解,刷题打卡写题解的过程用到了优先队列,随即想到其实现方法就是堆排序,翻书重新学习了一遍堆排序的算法,感觉以后二叉树系列的题可能会碰到0.0typedef pair<int, int> dat;class Solution{public: int findMaximizedCapital(int k, int w, vector<int> &profits, vector<int> &capit

2021-09-08 14:00:56 109

原创 进阶刷题——二分查找法

笔者将在LeetCode题库中由浅入深理解编写二分查找法相关题目并不断更新自己对该算法的理解与思考理解与思考:在遇到排好序的数组或要求时间复杂度为O(log n)的算法题,应第一时间想到二分查找法。循环的判断条件总是为Left与Right的大小关系,但具体问题具体分析,这也是二分查找法的一个难点。刷题过程中算法思路借鉴于官方题解,添加了详细注释用于理解LeetCode704-二分查找没什么好说的,二分查找最基础的题目,边界,循环条件都可简单思考出class Solution{public:

2021-09-05 21:50:39 140

原创 2021-09-05 LeetCode470(每日一题)

算法思路借鉴于官方题解,添加了详细注释用于理解,刷题打卡拒绝采样法(无优化)-存在最坏情况时间复杂度O(∞)(一直被拒绝)class Solution{public: int rand10() { //拒绝采样思路,目的就是构造等概率有规律的40个数字 while (1) { int a = rand7(), b = rand7(), res; res = (a - 1) * 7 + b; //产生1-4

2021-09-05 09:36:26 127

原创 2021-09-04LeetCode-39(LeetCode 热题 HOT 100)

CPP-无额外剪枝思路,但遍历过程中已达到一定程度上的去重class Solution {public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { vector<vector<int>> res; vector<int> combine; Dfs(candidate

2021-09-04 13:01:07 80

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除