
保研机试
Joseph_L_
Ain't no mountain high enough
展开
-
【unordered_set用法】求无序数组中的最长连续序列长度
大致思路:之前我仅仅停留在数组的层面上思考问题,怎么想都是复杂度为O(n^2),但是应该换一种容器——unordered_setunordered_set是基于哈希表,采用的是链地址法解决冲突。用这个容器的目的在于,它的查找用find函数很方便而且查找的复杂度为O(1)!!!!这是很牛逼的地方!!!另外,使用erase函数也可以方便地对集合中的特定值元素进行删除。所以,找到一个数,...原创 2019-06-15 14:12:58 · 938 阅读 · 0 评论 -
【数组】合并两个数组至有序 无需新建数组
是在A数组的原基础上直接进行merge。方法是从后往前merge(数组长度为m+n),依次取最大的放上去。不要担心A数组的原有元素被覆盖掉,因为分析代码,那个被覆盖的元素应该已经出现在了数组后面。AC代码:class Solution {public: void merge(int A[], int m, int B[], int n) { int i ...原创 2019-06-16 15:55:20 · 492 阅读 · 0 评论 -
【字符串】scramble string
相当于按这种二分(也不算找中心分啦)的结构,结构之间可以互换顺序,结构之内(由于又可以二分)也可以互换顺序。问你两个字符串互不互为这种关系。大致思路:刚开始没反应过来——其实这也是求“字符串的全排列”是否对应——>看各字母出现的次数。只不过,这涉及到二叉树的结构,很明显又让人知道要——递归。所以,就是遍历i来分割出不同的二叉树结构,然后递归地来看两个子树是不是满足全排...原创 2019-06-16 16:52:12 · 415 阅读 · 0 评论 -
【链表】partition list
给你一个单链表和一个数x,让小于x的结点都排到前面去(保证稳定性)。大致思路:刚开始我就像“反转链表”那道题一样想着头插法,先找到第一个>=x的结点然后再来遍历一次来头插,发现要考虑的因素特别多,还要考虑头结点会不会就是>=x的要被头插,那又像那道题一样要讨论。写出代码调好后,发现超时。。。后来想想,这种方法确实是完全一点辅助空间都不用。干嘛不用辅助空间??况且,其实对...原创 2019-06-16 19:49:52 · 162 阅读 · 0 评论 -
【栈】判断弹栈序列是否正确
大致思路:捋清楚!弹栈序列有误,首先判断:先入栈的元素比后入栈的元素先出栈。但是并不是这样就有误,其中有两种情况仍是正确的:① 前元素入栈后立马出栈② 前元素入栈后并没有立马出栈(先于它出栈的有它之后入栈的),那么就必须要在之前把它和后元素之间的元素全都出栈!我用了一个map来实现value-index,判断前后元素。并没有一次AC,原因是:未考虑弹出序列中存在入栈序列...原创 2019-06-05 09:01:03 · 292 阅读 · 0 评论 -
【二叉树】二叉树的遍历
二叉树的结构体struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x):val(x), left(NULL), right(NULL) {}};层次遍历用队queue<TreeNode*>来实现,每次都入队左孩子和右孩子。按照队的先进先出顺序...原创 2019-06-05 09:15:16 · 165 阅读 · 0 评论 -
【算直方图最大矩形面积】了解即可
Givennnon-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.Above is a histogram where width of each b...转载 2019-06-17 09:19:12 · 373 阅读 · 0 评论 -
【链表】删除重复结点
只是需要删除重复的多余结点,保留1个就行。大致思路:只需要在当前结点来进行处理就行,因为只是删除多余的,也不用担心头结点会被删去导致返回的不对的错误。一次AC。AC代码:class Solution {public: ListNode *deleteDuplicates(ListNode *head) { //看结点后面的值是不是一样,一样就跳过,直...原创 2019-06-17 10:41:12 · 518 阅读 · 0 评论 -
【数组】删除重复元素(最多重复两次)
只能允许最多重复两次,修改数组删除多余元素,并且返回删除后的数组长度。大致思路:刚开始想的是一个哈希数组来存出现次数,然后判断>2次的时候通过前移后面的部分来删除该元素。确实时间复杂度是O(n^2)太高了。还是要仔细读题!这是一个sorted array,也就是判断一个元素是否出现了两次,只需要看它前面的前面那个元素是否和它一样,一样则不要它,不一样则说明它还没有重复出现到两...原创 2019-06-17 11:30:41 · 1658 阅读 · 0 评论 -
【链表】反转链表II:只反转一部分结点
大致思路:就是用头插法反转,只不过要对可能的情况多加考虑!把链表分为三部分:前面不反转的before->h中间反转的->p后面不反转的。在遍历的过程中记录结点指针,最后进行连接。实现之后发现有指向空指针什么的,发现是因为before初始化为NULL,但如果m==1,即从一开始就开始反转,就没有“前面不反转的部分”了,所以最后的before->next=h的连接就会...原创 2019-06-16 14:50:48 · 1016 阅读 · 0 评论 -
【动态规划】求二叉树的结构情况数
动态规划的思想,dp[i]表示有i个结点可以构成的二叉树结构情况数。遍历选取第j个结点作为根节点,则dp[n]+=dp[j-1]*dp[i-j]class Solution {public: int numTrees(int n) { if(n<0) return 0; int dp[2000]={0}; ...原创 2019-06-16 11:42:12 · 398 阅读 · 0 评论 -
【字符串】判断s2是否是s1的旋转字符串
题目Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstri...原创 2019-06-16 11:01:06 · 858 阅读 · 0 评论 -
【二叉树】判断一棵树是否为另一颗树的子结构
大致思路:因为你可以包含在树上的很多地方,所以必须要先找到这个地方——先找到A的子树中和B树具有共同根结点的地方。那肯定就是要遍历,在二叉树上就是递归咯。找到共同根节点后,再判断是否“包含”。之前写过如何判断两棵树是否相同的代码(递归判断),这里只需要改下判断条件就行。判断条件:如果a为空b也为空,或者a不为空b为空,都可以说明b包含于a,tree。而如果a空而b不空,说明a并没有把b...原创 2019-06-04 09:55:13 · 465 阅读 · 0 评论 -
【层次遍历】Populating Next Right Pointers in Each Node
这个我自己一次性AC了,因为是完全二叉树,比较好讨论,用递归来做的。AC代码:/** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNode *left, *right, *next; * TreeLinkNode(int x) ...原创 2019-06-15 17:27:39 · 167 阅读 · 0 评论 -
【用空间救时间】实现栈的min函数
我写出本题的意义在于——一看时间复杂度的要求为O(1),应该立马知道:用空间来救时间。所以,应该是要开辅助栈来实现。AC代码:class Solution {public: stack<int> stack1,stack2; void push(int value) { stack1.push(value);...原创 2019-06-04 10:55:24 · 128 阅读 · 0 评论 -
*【动态规划】求子序列的个数 distinct subsequences
大致思路:其实本质是“求子序列的个数”。很明显,这种问个数的,一般用动态规划来做。这道题和“求最长公共子序列”(https://blog.youkuaiyun.com/m0_38033475/article/details/79492786)有些类似。类似的地方在于:序列都是可以不连续的。不同的地方在于:最长公共子序列是两个序列都随便出,找相同序列的最长的长度;这道题是母串必须包含子串的全部,而且...原创 2019-06-15 20:42:05 · 3616 阅读 · 0 评论 -
【动态规划】interleaving string 两个字符串交叉得到另一个字符串
大致思路:(via简书yoshino)这种又是涉及两个子串的题,又用动态规划来做。但是有时候很不好想到动态规划的含义,我觉得就大胆一点吧....而且一般这种字符串的动态规划都是跟“长度”有关!然后再举简单的例子来模拟过程,从而设计出转移方程!这道题过程看懂了就很好理解的,只是在编程要注意:dp数组下标从1开始,表示的是“第几个”或“有多长”,而字符串肯定是从0开始的。AC代码:...原创 2019-06-15 21:40:50 · 396 阅读 · 0 评论 -
矩阵的旋转
记住方法即可。(这里的矩阵都是方阵哈。)矩阵的逆时针旋转90°:先把主对角线两边的元素互换,再把第i行和第n-i行互换。矩阵的顺时针旋转90°:先把副对角线两边的元素互换,再把第i行和第n-i行互换。比如,对于顺时针旋转90°的AC代码:void clockwise(int a[][4],int n){ for(int i=0; i<n; ++i) ...原创 2019-06-15 22:22:53 · 1907 阅读 · 0 评论 -
【动态规划】字符串-分词
大致思路:不要浮躁!静下心来仔细分析问题,给问题划分步骤:其实肯定是要把dict中一个词一个词地去比较是否为s的子串,那么主要就是两个点:①找到子串起始位置 ②对子串的长度进行规定以便与单词比较所以,很可能就是两个循环的事情。现在要构思如何设计动态规划dp数组的含义:dp[i]==true表示0~i-1都可以分词,那么现在得从i开始看能不能子串从i这里开始能匹配上一个单词。需要用...原创 2019-06-04 16:00:58 · 801 阅读 · 0 评论 -
【滑动窗口】判断s2是否包含s1的全排列
大致思路:s2必须要包含s1的某种排列,必须是包含的那种连续的。刚开始我用全排列输出各种s1的排列,在递归的临界条件那儿判断是否被s2包含。显然,就算剪枝仍然超时,想想确实也是,人家递归类似于dfs是用来输出详细的组合信息的,而这里好像没这个必要这样做。不过,这个代码仍然有值得学习的地方:①输出全排列的递归算法温习(当前字符在或不在之后的组合中,若在则需要遍历位置);②判断两个字符串的...原创 2019-06-16 10:57:22 · 1656 阅读 · 0 评论 -
【dfs】word search
典型的dfs,去找这个阵型中有没有一条路是给出的单词。大致思路:dfs。注意点:vis数组别忘了写!!!!!if判断中要判断边界、题目条件还要判断是否访问过!!然后,还要在dfs的上文置vis[xx][yy]=1(尤其是如果在主函数中第一次调用,也要记得),在dfs的下文还原vis[xx][yy]=0,表示不走这条路,换一条路!AC代码:class Solution {pu...原创 2019-06-17 14:18:30 · 214 阅读 · 0 评论 -
【dfs“要”或“不要”】求子集;求组合
求一个序列的所有子集。大致思路:也是用dfs来做的,因为其实就是“要”或“不要”的问题,这是dfs可以解决的典型问题!注意:sort(start,end,排序方法),一般来说end=start+size(),但是vector有.begin和.end()指针就直接用呗。 vector的push_back是添加元素到末尾,那么pop_back则是删除末尾元素!...原创 2019-06-17 14:58:36 · 550 阅读 · 0 评论 -
【数组】sort colors
在原数组上不用sort函数来进行这样的一块儿一块儿的排序。大致思路:因为题目明确说用不要开辅助空间,也就是要在原数组上进行操作。我第一反应是:两个指针fast和slow,果然,这是正确的!因为题目说的场景也简单,直接手写一个例子,模拟快慢指针,找到规律,一次AC。AC代码:class Solution {public: void sortColors(int A...原创 2019-06-17 16:54:33 · 169 阅读 · 0 评论 -
【拖累思想】maximum subArray 求最大子数组
求(连续)子数组的最大和大致思路:一次AC,用到了我的“拖累思想”。AC代码:class Solution {public: int maxSubArray(int A[], int n) { if(n==0) return 0; if(n==1) return A[0]; ...原创 2019-06-18 16:23:02 · 194 阅读 · 0 评论 -
【二分快速幂】pow x-n
大致思路:温习二分快速幂的写法。注意,n有可能为负数!AC代码:class Solution {public: double pow(double x, int n) { if(n==0) return 1; if(n==1) return x; if(n<0) //注...原创 2019-06-18 16:46:39 · 208 阅读 · 0 评论 -
【set存储:去重+排序】4sum
从给定的数组中找到4个数的组合,和==target。组合不能重复,按非递减顺序。大致思路:要或不要,dfs。但是AC代码(别人的题解)里的剪枝很棒,结合了“按非递减顺序——递增顺序”的题意。另外,对于重复的问题,使用的是set来对vector<int>型的变量去重(比去find那种要快,而且不需要对结果重新排序)AC代码:class Solution { ...原创 2019-06-22 21:58:30 · 525 阅读 · 0 评论 -
【图形题】不要慌,慢慢来
这种构造图形矩阵的题,不要慌,慢慢来!找规律,找边界。很明显,就是边界的灵活移动,可以不从中间开始,可以从左上方开始~int m[15][15];int main(){ int c=10*10; //左上方的数 int l=1,r=10,u=1,d=10; //左 右 上 下的边界 int x=1,y=1; while(c>0) { for(int i=...原创 2019-07-01 19:59:53 · 363 阅读 · 1 评论 -
【字符串】最长公共前缀
求字符串数组里的字符串公共最长前缀大致思路:先对字符串排序,然后只需要比较第一个和最后一个的字符串,这两个字符串必定是差距最大的两个(因为排序首先从第一个开始排),如果首字符不等,就返回空,否则,说明所有字符串的首字符相等,那么接着判断第二个字符。AC代码:class Solution {public: string longestCommonPrefix(ve...原创 2019-06-23 16:14:38 · 2358 阅读 · 0 评论 -
【二叉树】求最大叶子间距
大致思路:根据举例子模拟找规律,发现需要去对每个结点求“左子树高度+右子树高度”,如左图=1+1=2是最大的,右图2+2=4是最大的。这里容易只求根节点的,但如右图这种情况,其实要对每个结点求,取最大值。实现上,我是定义BTNode结构体(left和right都是指针),然后求高度就是递归来做,同时在函数中更新高度和的最大值。别人题解里是只有int left;int right...原创 2019-07-02 06:54:46 · 693 阅读 · 0 评论 -
【dfs】机器人的运动范围
大致思路:显然用dfs,但是我没注意到:①dfs也要vis数组!!!而且,我其实常用的是第一次传第一个点进去,所以要在主函数里先把第一个点的vis设1!!!!②也是本题的重点:问的是“能够到达多少个格子”,这个意思不是说一条路径上最多能有多少个格子,而是若干条路径上,只要能走到就算!所以,这里并不是在dfs前先vis=1,之后就立刻vis=0。因为:以前的思路是另一条路线可以去走其...原创 2019-06-29 20:50:39 · 353 阅读 · 0 评论 -
【kruscal求最小生成树】继续畅通工程
大致思路:Kruscal求最小生成树用到的知识:图的边的结构体、按边权排序、并查集(不产生回路)但是这道题仍然需要精心思考,原因是有一些边是“已经存在的”,那么在计算最小生成树成本的时候应该只考虑未修成的边。要注意两个易错点: ① 多组数据,并查集father数组要初始化,一些全局数组要初始化。 ② 由于有些边已经存在,要先对已存在的边进行并查集的处理,否则在边权排序的时候它排到后...原创 2019-06-30 16:38:03 · 255 阅读 · 0 评论 -
【字符串】中缀->后缀->计算表达式的值
#include<iostream>using namespace std;#include<stack>#define maxSize 100stack<char> stack1; //栈来放后缀表达式的符号char suffix[maxSize]; //转化后的后缀表达式 int n=-1; //表示suffix字符数组的index,初始化...原创 2019-07-01 16:45:52 · 299 阅读 · 0 评论 -
关于大数的存储和处理
因为感觉好像很容易遇到大数的题目,所以这里要再强调一下大数怎么存、怎么处理。首先是存储,肯定是要用char数组在输入数据的时候就拿来存储的,然后涉及运算的时候就是我之前博客里的加减乘除、阶乘的做法。其实如果要排序啥的更方便,可以记住以下结构体的定义:struct numNode{ int isPositive; int digit; //位数 char ...原创 2019-07-01 16:31:50 · 1103 阅读 · 0 评论 -
【找规律】求123456789的第几个全排列
1~n(最多n=9即123456789),让你来求第K个全排列。(题中告诉你规律:1234...n的全排列一共有n!个)大致思路:举例子找规律的题,见下面这个例子:以n = 4, k = 17的情况来分析,所有排列组合情况如下:123412431324134214231432213421432314234124132431312431423214...原创 2019-06-18 15:26:06 · 3882 阅读 · 0 评论 -
【链表*】交换结点
只要涉及到链表结点的删除或交换,就必须新建虚拟头结点newHead->next=head,让f指针指向newHead作为前置结点指针(删除和交换都需要前置结点指针的),newHead当然不动,程序最后返回的是newHead->next。两个两个地交换结点两个两个地就地交换结点。大致思路:一定要先新建一个虚拟结点newHead,newHead->nex...原创 2019-06-21 19:29:26 · 6174 阅读 · 0 评论 -
【动态规划】edit distance 一个字符串->另一个字符串的编辑距离
一个字符串到另一个字符串,3种操作(增加、删除、替换),问要做多少步。大致思路:这道题的动态规划让我理解了一个小时。。。。。来看方法:理解的基础是要get一个点:f[i][j]表示word1[0..i]已经成功转换成word2[0...j]了的步数!所以,在聚焦于看一个字符时,来想想是怎么达到f[i][j]这个目的的,从而推出状态转移。就三种方法嘛:替换 删除 添加。那...原创 2019-06-17 20:44:30 · 247 阅读 · 0 评论 -
【字符串】生成匹配的括号
给出括号对数n,生成这n对匹配括号的全排列大致思路:我用的是dfs,做出来了。看到了一种更简单的方法:只要保证右括号个数不大于左括号就行了(若当前左括号个数>右括号个数,可加右括号)!AC代码:链接:https://www.nowcoder.com/questionTerminal/c9addb265cdf4cdd92c092c655d164ca来源:牛客网cla...原创 2019-06-21 21:02:01 · 503 阅读 · 0 评论 -
【数位】palindrome number
用常数空间,判断一个数是否是回文的。大致思路:我就是从数位的思想上一位一位去比较的,从低位开始比较是简单的,不过要想从高位开始,得先知道这个数是几位的。我才用的方法是让Left=1,每次*=10,如果这个数/left==0即可。也就是这个x的最高位也就是Left级别的(比如5000,left=10000)不过要注意溢出,尤其是Left容易溢出,所以用long long 来装!A...原创 2019-06-25 16:38:35 · 139 阅读 · 0 评论 -
【数位】reverse integer
反转数位。大致思路:对负数要有处理。关键是如何判断溢出(这里要理解,传进来的int型参数比如1000000003是不溢出的,但翻转后的3000000001溢出了)。看了大佬的方法,就是:判断这一次得到的res能不能返回去得到上一次的res,如果返回去不相等,则说明这一次的res溢出了。AC代码:class Solution {public: int revers...原创 2019-06-25 17:03:24 · 177 阅读 · 0 评论 -
【链表】rotate list
将最右边的K个元素拼接到最前面去。大致思路:我举了个1->2->3的例子模拟了一下,发现就是先一遍循环得到链表长度和链表最后一个结点指针tail,再来一遍循环直到n-k个元素,那么它的下一个元素就作为结果链表的头,让它断开,再把tail->next=head; 最后返回结果链表的头。思路正确。我发现我现在的链表题编程,需要注意的两个点:① 要找准返回的头在哪里...原创 2019-06-18 11:16:34 · 146 阅读 · 0 评论