剑指Offer
Joseph_L_
Ain't no mountain high enough
展开
-
【二叉排序树】二叉排序树的后序遍历
大致思路:思路比较简单粗暴:先找到根节点,然后去遍历序列,找到第一个大于根节点值的元素则为左子树的开头,以此划分开左右子树,递归(二叉树一般都递归!!!!)。要注意的点在于,有可能某个根节点没有左子树和右子树,应该怎么处理; 递归的临界条件有哪些情况(只剩一个结点、只剩两个结点),如何对这些情况进行正确判断。AC代码:class Solution {public: ...原创 2019-06-05 10:04:07 · 2285 阅读 · 0 评论 -
【栈】判断弹栈序列是否正确
大致思路:捋清楚!弹栈序列有误,首先判断:先入栈的元素比后入栈的元素先出栈。但是并不是这样就有误,其中有两种情况仍是正确的:① 前元素入栈后立马出栈② 前元素入栈后并没有立马出栈(先于它出栈的有它之后入栈的),那么就必须要在之前把它和后元素之间的元素全都出栈!我用了一个map来实现value-index,判断前后元素。并没有一次AC,原因是:未考虑弹出序列中存在入栈序列...原创 2019-06-05 09:01:03 · 261 阅读 · 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 · 104 阅读 · 0 评论 -
【二叉树】判断一棵树是否为另一颗树的子结构
大致思路:因为你可以包含在树上的很多地方,所以必须要先找到这个地方——先找到A的子树中和B树具有共同根结点的地方。那肯定就是要遍历,在二叉树上就是递归咯。找到共同根节点后,再判断是否“包含”。之前写过如何判断两棵树是否相同的代码(递归判断),这里只需要改下判断条件就行。判断条件:如果a为空b也为空,或者a不为空b为空,都可以说明b包含于a,tree。而如果a空而b不空,说明a并没有把b...原创 2019-06-04 09:55:13 · 428 阅读 · 0 评论 -
【位运算】二进制中1的个数
大致思路:我以为是很简单的循环右移+&1就OK了,但是由于是负数,右移会自动在左边补符号位1(这叫算术运算,而补0的叫逻辑运算)。因此,n不会=0,所以会一直跳不出循环。因此,对于这个问题,看题解发现一个巧妙的方法:unsigned int nn=n;取unsigned int,这样的话就可以把负数带给二进制的影响给取消掉,就按正数的二进制来思考!AC代码:...原创 2019-06-04 08:45:30 · 103 阅读 · 0 评论 -
【递归】字符串的全排列
大致思路:其实之前一直不能很好地理解全排列,直到看到一个有意思的解释。全排列是由递归实现的,为了设计递归,只分析“当下”:针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去(每个位置都可以放,所以遍历位置,与之后的每个元素都进行交换);第二是不把这个字符放到组合中去(其实就是和自身交换)。同理,之后的每个字符都是这样操作。递归实现。临界条件是:当前针对的这个字符到了最后一...原创 2019-06-14 19:08:29 · 655 阅读 · 0 评论 -
【树】二叉搜索树与双向链表
大致思路:其实这种二叉树的题大多都用“递归”解决。只是这道题刚开始我没找到递归的思路。如果有多个结点在子树中,就需要找清楚到底哪个才是根节点的前后结点。如:可以知道,这显然就是按照树的中序遍历来的嘛。。然后。。。分析了半天。。。因为二叉排序树的中序遍历本来就是有序的,所以其实就是中序遍历,只是要考虑个pre结点把前后关系连起来而已!!这个代码我也是研究了一会儿的,注意p...原创 2019-06-14 18:27:33 · 103 阅读 · 0 评论 -
【动态规划】矩形覆盖
每次要么横着放两个,要么竖着放一个。刚开始采用dfs做,方法正确但超时了: int ans=0; int n; void dfs(int x) //x是当前到达的x值,x<=n { if(x>n) return; if(x==n) //该方案成功,方案数+1 { ...原创 2019-06-03 09:20:46 · 154 阅读 · 0 评论 -
【修改版二分查找】旋转数组的最小数字
大致思路:首先要把题多读几遍,理解题意!题意:给你一个旋转后的数组,让你找最小值。发现数字规律:由于是非递减序列,可以先认为就是递增序列,再去考虑相等的情况。以{3,4,5,1,2}这个旋转数组为例,可以知道其实分为两区,左区是更大的。而我们要找的最小的元素,就是左右区的临界元素,这里是1.对于这种“顺序查找”可以解决的题目,为了优化,最好采用“二分查找”——用left和rig...原创 2019-06-02 10:38:39 · 78 阅读 · 0 评论 -
【栈】用两个栈实现队列
大致思路:push都是入栈1要pop的时候,要先从栈1将所有数据都转入栈2,出栈一个后要把其余数据都返回栈1。这样才能保证每次出栈都是出的最先入栈的元素,也就是栈1栈底的元素。AC代码:class Solution{public: void push(int node) { stack1.push(node); } ...原创 2019-06-02 09:47:46 · 107 阅读 · 0 评论 -
【二分查找】二维数组中的查找
链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e来源:牛客网两种思路一种是:把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是nlogn我之前写二分法都是想着用递归来实现,不得不重新定义一个函数,其实不用,只需要用一个while...原创 2019-06-01 09:27:08 · 416 阅读 · 0 评论 -
【链表】复杂链表的复制
大致思路:刚开始想的是新建一个链表,按next关系一个一个地复制,复制好再来管random。这个random指针是个问题,因为很难去知道“原链表里指向了a结点”这个a结点应该是新链表里的哪个结点,感觉需要去找个结点之间的对应关系,而结点值又不一定都不一样,所以只能通过“第几个”这种序号来找,那还是得挨个遍历嘛,很明显这个时间复杂度是O(n^2)看到题解之后豁然开朗,原来这种结点之间的对...原创 2019-06-08 19:36:17 · 195 阅读 · 0 评论 -
【二叉树】二叉树中为某一值的路径
大致思路:二叉树嘛,就递归。这道题我用dfs来解决,找好临界条件,剪枝,注意vector存储的是数值不是结点。有一个问题就是,我这样dfs得到的结果vector数组中,并不是按vector长度从大到小来排列的,因为dfs有可能左子树的更短但是先去看的左子树的路径。因此,需要对vector数组进行排序,并且记录数组下标,从而建立新的vector数组。我想到的方法就是map<in...原创 2019-06-08 15:53:58 · 146 阅读 · 0 评论 -
【dfs】机器人的运动范围
大致思路:显然用dfs,但是我没注意到:①dfs也要vis数组!!!而且,我其实常用的是第一次传第一个点进去,所以要在主函数里先把第一个点的vis设1!!!!②也是本题的重点:问的是“能够到达多少个格子”,这个意思不是说一条路径上最多能有多少个格子,而是若干条路径上,只要能走到就算!所以,这里并不是在dfs前先vis=1,之后就立刻vis=0。因为:以前的思路是另一条路线可以去走其...原创 2019-06-29 20:50:39 · 310 阅读 · 0 评论