- 博客(70)
- 收藏
- 关注
原创 Vim基本操作
Vim三个主要模式normal mode(command mode)Insert modevisual modenormal mode => insert mode在下方插入一行: o在上方插入一行:O在当前光标后插入:a在当前光标前插入:i在行尾插入:A在行首插入:I光标移动基础移动上下左右:hjkl移动到第一行:gg移动到最后一行:G移动到指定行:nG进阶移动移动到下一个单词的开头:w移动到下一个单词的结尾:e移动到上一个单词的开头
2022-04-27 08:33:28
1424
1
原创 LeetCode 84. Largest Rectangle in Histogram C++ 单调栈
Problem题目链接Solution题意为:给你一个数组,这个数组代表了一个柱状图(数组中的每个元素代表每个柱子的高度),让你求出这个柱状图中能取到的面积最大的矩形面积。单调栈:栈中元素保持单调递增或递减的单调性。其中栈的单调性是指元素出栈后的序列的单调性,因此栈顶元素大于栈底元素的单调栈是递减栈,反之是递增栈。这题可以用递减栈来做顺序遍历原序列:如果栈为空或栈顶元素对应的数组元素小于等于目前遍历到的元素,则把当前元素的下标入栈否则,最大的面积就可能出现在之前的元素中(可以这么想,如果元
2020-06-30 10:11:10
3688
原创 LeetCode 301. Remove Invalid Parentheses C++
Problem题目链接Solution题意为,给定一个字符串,让你移除最少的不合法的括号,让剩下的字符串合法,所给的字符串中可能含有(、)之外的字符。返回所有合法的字符串。这题个人感觉比较难,ac前参考了很多别人的博客。做这题时,我们需要明确以下几个事情:1、如何判断一个括号字符串是否合法?一个长度为n的字符串下标为0~n-1,那么对于任何一个0 ~n-2上的字符,都需要保证左括号的数量>=右括号的数量,否则就是不合法的;在n-1上,如果左括号数量=右括号数量,那么这个串最终就是合法的,否
2020-06-27 21:00:25
197
原创 LeetCode 581. Shortest Unsorted Continuous Subarray
Problem题目链接Solution题意为:给定一个数组,找出其中的最短未排序连续子串。e.g [2,6,4,8,10,9,15]这个序列,我们只要把中间的子串:[6, 4, 8, 10, 9]排好序,整个原数组就有序了。不需要排序的元素就是排序前和排序后在同一位置上的元素。而且因为要求找出一个连续子串,那么,我们只需要找出最左边和最右边的排序前后下标改变的元素就可以了。其实这整个过程就像选择排序一样,每次都在剩余元素中选出最小值,放在已经有序的子串后面,重复这个过程,就可以达到整体有序。一
2020-06-21 14:45:51
131
原创 LeetCode 287. Find the Duplicate Number
Problem题目链接Solutiondiscuss里的一种解法时间o(n) 空间o(1) 方法是把数组看成有环链表来做很多博客没分析为什么能把该题看成有环链表?自己想的,记录一下。我们先考虑这种情况:长度为n的数组,1~n数字正好每个出现一次index 0 1 2 … n-1nums 1 2 3 … n设一个指针p=0,迭代时用p=nums[p]来更新p,那么根据nums中1~n正好各出现一次可知(nums的值用来当作下标index),因此正好可以根据p=nums[p]遍历长度为n的
2020-06-17 18:54:28
106
原创 RMQ问题之ST算法 C++实现
Problem题目链接SolutionRMQ(Range Minimum / Maximum Query)问题是指给定一个数组,有很多的query,问你该数组[i,j]区间里的极大/小值是多少。注意,该问题的难点在于很多query,因此对每一个query都进行遍历求最值的暴力算法肯定不行对于给定数组,并不会更新数组的RMQ问题,我们可以采用ST算法来做ST算法的具体做法就是定义dp[i][j]为区间[i,i+2^j-1]里的极值,即从i开始的连续2 ^j个值里的极值容易想到,当区间长度为1时
2020-05-27 21:19:36
311
原创 LeetCode 221. Maximal Square C++
Problem题目链接Solution题意为给定一个二维数组,其中元素都有0和1组成,找到最大的正方形(其中元素都为1)算出其面积定义二维数组dp,其中dp[i][j]的含义是,以(i,j)这个位置为右下角的正方形边长那么考虑dp[i][j]怎么求dp[i-1][j-1]代表以(i-1,j-1)为右下角的最大正方形边长那么若要把(i,j)接在(i-1,j-1)之后组成一个更大的正方形首先(i,j)这个位置必须是元素1其次(i,j)要能和(i-1,j-1)组成新正方形,那么要考虑这个新正方形
2020-05-24 22:44:28
125
原创 LeetCode 1071. Greatest Common Divisor of Strings C++
Problem题目链接Solution题意为:给定字符串str1,str2,找出这两字符串的最大的公共循环节例如ababab和ab的最大公共循环节是ababababab和abab的最大公共循环节abab那么,若str1和str2存在公共循环节,那么str1和str2的最小循环节应该是相同的例如 abababab和abab的最小循环节都是ab,那么它们之间必定存在公共循环节那么由最小循环节相同我们可以知道 str1+str2==str2+str1否则肯定不存在公共循环节那么怎么求最大公共循
2020-05-21 16:25:01
171
原创 模式串匹配之KMP算法&BM算法&sunday算法
KMP算法解决了这样一个字符串匹配的问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置。这个算法减少了暴力算法中的文本串指针的回溯,每次失配时只回溯模式串p的指针,极大提高了效率//// Created by DongChenglong on 2020/5/13.//#include <cstdio>#include <string>using namespace std;void getnext(int next[], string s) {
2020-05-20 20:39:29
476
原创 LeetCode 234. Palindrome Linked List C++ 快慢指针
Problem题目链接Solution题意为给定一个链表,每个节点存一个0~9的数字,叫你判断这个链表的内容是否为一个回文串。思路就是利用快慢指针,快指针每次走两步,慢指针每次走一步,当快指针抵达链表尾部的时候,慢指针到达链表中间,需要注意的是,因为回文串是正读泛读都一样的字符串,因此慢指针移动时,我们需要把链表前半部分的next指针做一个reverse,这样我们就可以在o(n)时间o(1)空间判断是否是回文了。按照这个思路,我写了以下代码写的逻辑很混乱虽然自己测试没什么问题,但是submit
2020-05-18 15:14:06
121
原创 LeetCode 141. Linked List Cycle C++ 快慢指针
Problem题目链接Solution题意为,给你一个链表,这个链表的尾节点的next可能连接到了之前的某个节点,就形成了一个环,请你判断所给的链表是否含有环。我自己的做法就很暴力,开了set,边遍历边存下指针,判断是否有之前出现过的指针重复出现,若重复出现则必定存在环。在Discuss里看到了一种快慢指针解法,觉得太太太巧妙了!设两个指针,同时出发,但一个指针每次走两步,一个指针每次走一步,若存在环,则两个指针经过一定步数之后必定会相遇,快慢指针只需o(1)的空间复杂度。class S
2020-05-16 19:06:37
126
原创 LeetCode 155. Min Stack C++
Problem题目链接Solution这题的题意一开始看错了我看题目还以为让实现最小堆(写这句话的时候突然反应过来堆的英文是heap QAQ)其实题目就是让你实现一个普通的栈,有常规的push、pop、top操作另外让你在o(1)时间内实现查找栈中的最小元素那么,因为栈是FILO的数据结构,我们只需另外开一个栈,来记录到某个位置时栈中的最小元素拿入栈的元素和另外这个辅助栈的栈顶元素比较若入栈元素小,则成为新的栈中最小元素否则要把原来的栈顶元素再一次入栈,表示到这个位置为止的最小值cla
2020-05-16 16:46:58
182
原创 LeetCode 1025. Divisor Game C++
Problem题目链接Solution题意为,Alice和bob玩一个游戏,给定一个数字N,每个人从(0,N)这个区间选出一个能整除N的因子x(N%x==0),然后N替换为N-x,换一个选手重复这个过程,谁无法重复这个过程了谁就输了。alice先手。这道题我最初的做法就是列了前9次游戏的可能性,发现如果初始的N是偶数,就是alice赢,初始的N是奇数,就是bob赢。class Solution {public: bool divisorGame(int N) { retu
2020-05-11 10:40:47
453
1
原创 LeetCode 198 LeetCode 213 LeetCode 337 House Robber 系列
Problem题目链接:House RobberHouse Robber IIHouse Robber IIISolution三题的背景都一样:有一些房子,每幢房子有一定价值,一个强盗去抢劫这些房子,抢劫了某个房子就能获得对应价值,不过这些房子按照一定的规则相连,强盗不能把直接相邻的两个房子都抢劫了,否则会触发警报,问你强盗最多能抢到多少钱。该系列的第一题,这些房子就是按照直线排列的设房子编号为1-n,定义dp[i]为从1-i号房最多能抢多少钱对于第i个房子,有两种策略,抢或不抢若不抢,
2020-05-10 15:14:27
133
原创 LeetCode 312. Burst Balloons C++
Problem题目链接Solution此题题意为,给你n个气球,气球上有数字,你可以任意戳破第i个气球,你就会得到nums[i-1] * nums[i] * nums[i+1] 个硬币,然后第i个气球消失。问你戳破所有气球,最多能得到多少个硬币。此题暴力的想法就是去枚举所有戳破的策略,但是,戳破n个气球的全排列有n!种方案,解空间实在太大。想不出好的解法以下思路完全参考此博文定义dp...
2020-05-06 21:12:07
205
原创 背包问题求方案数
Problem题目链接Solution此题在01背包的基础上,需要你求出最优选法的方案数需要另开一个数组来记录方案数。此处需要注意,虽然是01背包的另一种问法,但此题需要把dp[1…m]初始化为负无穷。这样做的原因是,如果dp数组全部初始化为0,那么dp[k]的含义为容量为k时背包装的最大价值(注意此处不一定被装满了),那么这样就会造成重复计数的问题。若把dp[1…m]初始化为负无穷,那...
2020-05-05 14:59:08
439
原创 LeetCode 239. Sliding Window Maximum C++ 单调队列
Problem题目链接Solution题意为给定一个数组,给定一个长度为k滑动窗口,这个滑动窗口从数组最左边滑到数组最右边,每次滑动的时候,让你求位于滑动窗口内的数字的最大值。此题最暴力的解法就是,枚举所有起点i,每次都从i开始遍历k个数字找出最大值,时间复杂度o(n^2)如果利用单调队列,那么我们就可以把时间复杂度降到o(n)单调队列的队首元素一定是当前滑动窗口内的最大值,整个单调队...
2020-04-30 22:49:59
155
原创 LeetCode 416. Partition Equal Subset Sum C++
Problem题目链接Solution题意为给你一个只包含正整数的非空数组,让你判断是否能把这个数组分成两部分,使得两部分的数字之和相等。若原数组所有数字之和是奇数,那么我们肯定不能分成两个和相等的子数组。若原数组所有数字之和是偶数,总和为sum,则可以把原题转化成背包问题:给你n个物品,n个物品分别有他们的质量,问你是否能从n件物品中选出若干件,这若干件的质量正好能装满容量为sum/2...
2020-04-29 09:43:34
147
原创 LeetCode 139. Word Break C++
Problem题目链接Solution题意为:给你一个非空字符串s,一个单词列表,让你判断是否能把s分割成若干单词(单词必须在所给列表里出现过)dp[i]表示s[0,i]是否能正确分割。那dp[i]怎么算呢?我们只需要遍历j属于[0,i],用j把[0,i]的字符串分割成两部分,[0,j]和[j+1,i],[0,j]区间是否能正确分割直接用dp[j]就可以知道,然后再去查找[j+1,i]子...
2020-04-28 11:16:10
187
转载 Catalan卡特兰数
卡特兰数是组合数学中一个常出现在各种计数问题中的数列,其前几项为(从第零项开始) : 1, 1, 2, 5, 14, 42…计算卡特兰数的通项公式:h(n)=C(2n,n)/(n+1)卡特兰数的应用卡特兰数经常出现在OI以及ACM中,在生活中也有广泛的应用。下面举几个例子。1、进出栈问题:栈是一种先进后出(FILO,First In Last Out)的数据结构.如下图1,1,2,3,4顺...
2020-04-27 22:34:12
501
原创 LeetCode 279. Perfect Squares C++
Problem题目链接Solution题意为:给定一个整数n,问n最少能由多少个完全平方数(1、4、9…)相加得到。我的思路:1、若n就是完全平方数,那么结果就是12、若n不是完全平方数,那么dp[n]=dp[n-t]+dp[t],其中t是小于n的完全平方数。那么就需要去遍历所有小于n的完全平方数。我自己的做法是用一个数组去存下目前所有的完全平方数(对应下面代码里的A)。在网上看到别...
2020-04-27 11:12:29
157
原创 LeetCode 63. Unique Paths II C++
Problem题目链接Solution此题为LeetCode62的后续,在62题的基础上,增加了障碍限制(若格子上有障碍,则无法通过这个格子)有了62题的基础,我们可以直接写一维dp因为只能向下或向右走,若地图中某个格子有障碍,那么该格子方案数都需要置0。此处有个特别注意的地方,若第一行中有障碍,那么不光该格子需要置0,且第一行中这个位置后所有格子都需要置0。若某格子没有障碍,那么dp...
2020-04-26 08:58:40
89
原创 LeetCode 62. Unique Paths C++
Problem题目链接Solution题意为给你一个n行m列的棋盘,左上角的格子里有一个机器人,机器人每次只能向右或者向下走一步,问走到右下角的格子上有几种走法。很明显是动态规划的题,设dp[i][j]是走到(i,j)这个格子的走法总数,那么其值就为dp(i-1,j)dp(i,j-1)两数之和(此处i-1、j-1需合法)考虑边界情况,即i1或j1时,因为只能向下或向右走,所以这些格子都是...
2020-04-25 12:56:34
147
原创 LeetCode 70. Climbing Stairs C++
Problem题目链接Solution题意为:每次爬楼梯,只能走1个台阶或2个台阶,问你走到第n阶有多少种走法。思路:设想现在已经走到了第n阶,那么想一想前面一步是怎么移动的?我们只能从第n-1阶走1步,或者从第n-2阶走2步,这样就能到达第n阶。重复这种做法,就能到达递归基的情况。上面是递归(自顶向下)的解法,同样,我们也可以用dp解法(自底向上)n=0,n=1时都只有一种走法,这就...
2020-04-24 09:46:00
182
原创 LeetCode 300. Longest Increasing Subsequence C++
Problem题目链接Solution题意为给定一个数组,要你求最长递增子序列(PS子序列是可以不连续的,子串则必须连续)动态规划解法,dp[i]为以i为结尾的最长递增子序列长度,那么对于0<=j<i,若nums[i]>nums[j],则i位置可以接在j位置后组成递增子序列,状态转移方程为dp[i]=max(dp[i],dp[j]+1)最后再遍历整个dp数组,找出最长递...
2020-04-23 15:18:18
132
原创 二分查找学习总结
基于减而治之的思想,在有序向量的区间[lo,hi)内查找元素e二分查找版本Aint binsearch(int* A,int e,inr lo,int hi){ while(lo<hi){ int mid=(lo+hi)>>1; if(e<A[mid]) hi=mid; //深入前半段[lo,mid)继续查找 else if(A[mid]>e) l...
2020-04-23 11:49:18
795
原创 LeetCode 98. Validate Binary Search Tree C++
Problem题目链接Solution给定一个二叉树,判定这棵二叉树是不是二叉搜索树。题目规定左子树的值需要严格小于根节点,右子树的值需要严格大于根节点。我的方法用到了一个二叉搜索树的性质,那就是,二叉搜索树的中序遍历结果一定是非降序的,反之亦然!那么我们只需要判断该树的中序遍历结果是不是单调的就可以判断原树是不是一棵二叉搜索树了。/** * Definition for a bin...
2020-04-22 09:55:56
124
原创 LeetCode 235. Lowest Common Ancestor of a Binary Search Tree C++
Problem题目链接Solution题意为给定一个BST(二叉搜索树)和两个树中的节点p、q,要求你找出p、q节点的最低公共祖先节点。最低公共祖先节点定义为树中同时有p、q两个后代节点的最低节点,同时,一个节点也可以作为其自身的祖先节点。题目还规定了1、树中节点所有值不同2、p和q是不同的两个节点且必定存在于树中有了这两点规定,就不用考虑很多的边界情况了,处理还是比较方便的。基于BS...
2020-04-21 22:43:06
115
原创 LeetCode 110. Balanced Binary Tree C++
Problem题目链接Solution题意为,给定一棵二叉树,让你判定这棵二叉树是否是平衡二叉树(树种每个节点的左右子树高度差不超过1)。这里复习一下树的高度的知识点,树的高度是指某一节点到叶子节点最长简单路径边的条数,因此叶子节点的高度为0。那么我们就可以递归的来计算所有子树的高度,若在某节点不符合平衡二叉树的定义,则直接返回-1。/** * Definition for a bi...
2020-04-20 08:49:48
84
原创 LeetCode 226. Invert Binary Tree
Problem题目链接Solution题意是给定一棵二叉树,需要你把左右子树交换次序。那么我们自顶向下,用递归的方式把左右子树交换就行了。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;...
2020-04-14 15:48:27
78
原创 LeetCode 257. Binary Tree Paths
Problem题目链接Solution此题题意为,给定一棵二叉树,要求你找出所有根到叶节点的路径,题目也没有对访问次序做要求。那么我们只要简单地对整棵树做DFS就行了。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr...
2020-04-14 15:11:41
66
原创 THOJ 祖玛(Zuma)
ProblemDescriptionLet’s play the game Zuma!There are a sequence of beads on a track at the right beginning. All the beads are colored but no three adjacent ones are allowed to be with a same color....
2020-04-12 12:08:20
269
原创 LeetCode 101. Symmetric Tree
Problem题目链接Solution给定一棵二叉树,判定其是否是镜像对称的,即交换左右子树后是否和原树相同。设根节点对应的左右子树为L,R,解法就是比较L与R是否对称,要对称的条件就是L、R根节点的val相同并且L的左子树与R的右子树对称并且L的右子树与R的左子树对称。可以用迭代、递归两种方法实现。递归版本:/** * Definition for a binary tree n...
2020-04-12 09:51:01
68
原创 LeetCode 103. Binary Tree Zigzag Level Order Traversal
Problem题目链接Solution题意为做二叉树的之字型层序遍历。即在二叉树的层序遍历基础上,第1、3、5…层(奇数层)的遍历结果反转即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *righ...
2020-04-11 16:06:22
62
原创 LeetCode 107. Binary Tree Level Order Traversal II
Problem题目链接Solution题目要求二叉树自下而上的层序遍历结果。那么换个角度想,我们可以自上而下的做层序遍历,最后只需要把层次之间做相应的逆序就可以了。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tree...
2020-04-11 16:02:26
76
原创 LeetCode 100. Same Tree
Problem题目链接Solution给两棵二叉树,判定两棵树是否相同。那么我们只要从根节点开始,先比较根节点的值是否相同,这里需要对根节点为NULL做特殊判断,因为若根为NULL是没有实际值的再进行val的比较会产生错误,再递归的对根节点左右子树进行比对就行。/** * Definition for a binary tree node. * struct TreeNode { ...
2020-04-11 15:39:30
74
原创 LeetCode 145. Binary Tree Postorder Traversal
Problem题目链接Solution递归版本的后序遍历十分简单,不再赘述。仿照preorder、inorder的思路,我们要找出一种迭代模式,不断重复这种模式,就可以得到最后的后序遍历结果。后序的访问顺序是左右中,因此最先被访问的,是从根节点一直左走,无左孩子可以向右边走(有右孩子的话)。这样一路下来,所有路过的节点都被压入栈中(如果同时有左右孩子要入栈,那么一定要右孩子先入栈,因为栈...
2020-04-10 22:32:24
83
原创 LeetCode 102. Binary Tree Level Order Traversal
Problem题目链接Solution给定一棵二叉树,输出对应的层序遍历结果。二叉树层序遍历只需借助数据结构中的队列queue就可实现。这题的输出要求按二维数组的格式输出,每层的数据对应于一维,那么某层的节点个数如何确定呢?我们可以在每层遍历开始时,记录一下这个时候队列的size,就是这一层的节点个数了。具体解释就是,每层遍历开始时,上层的节点已经全部出队了,下层的节点还未入队,因此当前...
2020-04-07 17:46:36
56
原创 LeetCode 144. Binary Tree Preorder Traversal
Problem题目链接Solution给定一棵二叉树,输出其先序(preorder)遍历结果。想法有三第一种,递归版本。因为二叉树的遍历定义其实就是一种递归形式的定义,因此很好想到对应代码。但是递归有一个问题,产生的空间复杂度比较高,因为系统栈每次都会把所有变量都临时保存,会产生很多的重复。/** * Definition for a binary tree node. * str...
2020-04-06 13:32:34
89
原创 THOJ 范围查询(Range)
DescriptioinLet S be a set of n integral points on the x-axis. For each given interval [a, b], you are asked to count the points lying inside.InputThe first line contains two integers: n (size of S...
2020-04-04 22:05:04
383
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人