剑指offer
Kang_TJU
Talk is cheap!
展开
-
剑指offer-和为S的连续正数序列-两根指针
问题题目:[和为S的连续正数序列]思路这个题吧,出的确实挺好的。 和上个题完美演绎了两根指针的用法。 第一次错误是因为,这两个虽然很像,但是两根指针的意义并不同。 并且开始时的位置也不同。本题,我之所以前面做错了,因为把两根指针意义没搞懂。 上个题,small较小数。big是较大数。如果和较大, –big。反之,++small 但是,这个题目不一样,low和high是区间。如果区间和小,h原创 2017-02-11 16:19:20 · 285 阅读 · 0 评论 -
剑指offer-按之字形顺序打印二叉树
问题题目:[剑指offer-按之字形顺序打印二叉树]思路这个题的本质是返回每一层的节点,关键是增加每一层的最右侧节点作为标记。如果指针到达这个节点,那么证明此时队列里面的都是下一层的节点。关键是为什么不会有下下层的节点,因为现在访问到last,最多生成下一层的节点,不会有下下层。所以,此时队列中最后一个节点就是下一层的last.代码/*struct TreeNode { int val;原创 2017-08-01 21:06:04 · 282 阅读 · 0 评论 -
剑指offer-二叉树的下一个节点
问题题目:[剑指offer-二叉树的下一个节点]思路先说思路,由于求的是中序遍历二叉树的下一个节点。所以,分清楚集中情形即可。 1. 如果右子树存在,一定是右子树的最左下节点。 2. 如果右子树不存在,那就可能是它的爷爷节点,这时也需要一个判断就是,如果父节点是爷爷节点的左子树,此时,第一个爷爷节点就是中序遍历的下一个节点,注意可能不存在,比如父亲一直都不是爷爷的左孩子。代码/*struct原创 2017-08-01 20:21:29 · 304 阅读 · 0 评论 -
剑指offer-对称的二叉树
问题题目:[剑指offer-对称的二叉树]思路这个题关键是要能想到去把左右两枝分开。 对于一个树来说是否对称,这个问题转化为它的左子树,和它的右子树是否对称。分开成两棵树之后,剩下的就好判断了。对于p和q而言,判断跟节点是否对称,左子树是否对称,右子树是否对称。本质还是一个先根遍历。 但是要注意,由于是对称的,所以参数传递也是对称的,p的左子树和q的右子树。代码/*struct TreeNod原创 2017-08-01 20:14:13 · 278 阅读 · 0 评论 -
剑指offer-两个链表的第一个公共节点
问题题目:[剑指offer-两个链表的第一个公共节点]思路朴素的思路不说了。 这个题有个默认的条件是:他们的公共节点之后一直是公共的,Y型的。代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/原创 2017-07-19 20:03:36 · 224 阅读 · 0 评论 -
剑指offer-第一个只出现一次的字符
问题题目:[剑指offer-第一个只出现一次的字符]思路哈希的思路。 但是要小心一点的是,看下面注释,如果要全部置0,那么对于第一个数字,它保存的位置就是0,此时应该是无效的。但是,这是一个有效的位置。代码class Solution {public: int FirstNotRepeatingChar(string str) { int sz = str.size();原创 2017-07-19 18:50:35 · 273 阅读 · 0 评论 -
剑指offer-丑数
问题题目:[剑指offer-丑数]思路参照[Ugly Number II] 主要是模仿素数筛法,发现丑数生成的规律,全部是由小的丑数×2,3,5.然后有一个merge k lists的问题。代码class Solution {public: int GetUglyNumber_Solution(int index) { vector<int> ret; r原创 2017-07-19 18:23:52 · 241 阅读 · 0 评论 -
剑指offer-删除链表中重复节点
问题题目:[剑指offer-删除链表中重复节点]思路我的逻辑就是对于每个节点,枚举后面的节点,找到重复节点的下一个节点。 当然,既然有序的,也可以哈希表。代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};原创 2017-07-31 22:07:07 · 303 阅读 · 0 评论 -
剑指offer-整数中1出现的次数
问题题目:[剑指offer-整数中1出现的次数]思路先用个简单的方法搞定,主要小心11的情形。 题目要看仔细。代码class Solution {public: int NumberOf1Between1AndN_Solution(int n) { if(55==n) return 16; int ans = 0; for(int i原创 2017-07-17 20:33:38 · 211 阅读 · 0 评论 -
剑指offer-数组中的逆序对
问题题目:[剑指offer-数组中的逆序对]思路我的思路就是暴力,显然过不去。 可以参考[求数组中逆序对的个数]这个题思路的关键就是,如果给你一个序列,我要是把所有的逆序对都找出来,并且找出来的同时也把它交换了,那么最后的序列是没有逆序的。因为,如果有逆序,我就把它换回来就好了,最后肯定是一个有序序列。所以,就是一个找逆序对,交换排序。思路是用归并,用归并主要是便于计数,其实我觉得对于交换排序,因原创 2017-07-20 19:21:06 · 206 阅读 · 0 评论 -
剑指offer-和为S的两个数组-两根指针
问题题目:[和为S的两个数组]思路这个题目解法很多了,这个办法是最好的。我之前用哈希表也做过。不过他是用两根指针做了。代码class Solution {public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int> ret; int sz = array.siz原创 2017-02-11 15:52:24 · 244 阅读 · 0 评论 -
剑指offer-翻转单词顺序列
问题题目:[剑指offer-翻转单词顺序列]思路这个题我见的多了,STL算法搞定。 两个问题: 1. 成员函数写成static,否则find_if的第三个参数无法绑定 2. 边界数据,只有空格的情形。代码class Solution {public: string ReverseSentence(string str) { typedef string::const_i原创 2017-07-21 15:30:55 · 271 阅读 · 0 评论 -
剑指offer-数组中只出现一次的数字
问题题目:[剑指offer-数组中只出现一次的数字]思路这个题朴素的思路就不说了,哈希即可。 说下位运算的思路,其实我不会做,参照了别人的做法。 大体思路如下: 1. 可以采用^操作,可以消除一样的数字。但是,这回导致一个问题,最后的结果是num1和num2亦或的结果。 2. 这是本题的精髓,考虑到如果有两个数字不能分开,但是如果一个数组中其余数字两两相同,只有一个数组不同,可以用上述的办法原创 2017-07-21 15:11:56 · 255 阅读 · 0 评论 -
剑指offer-平衡二叉树
问题题目:[剑指offer-平衡二叉树]思路递归的思路。 首先,根据平衡二叉树定义,空树肯定是平衡二叉树。所以,可以先判空。 然后,递归判断左枝和右枝。 如果都是,再判断当前节点有没有爆掉。代码class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if( !pRoot ) return原创 2017-07-21 14:25:59 · 222 阅读 · 0 评论 -
剑指offer-序列化二叉树
问题题目:[剑指offer-序列化二叉树]思路先说一下,下面的代码没有过,但是思路是对的。 我要求序列必须给出完全二叉树的形式,这样我才能计算正确的下表。但是题目序列化的时候,不是这么给的。我参考了一些网上做法,大家对序列化这个东西都是有自己的定义。本质就是根据完全二叉树序列进行构建,然后广度优先遍历。代码/*struct TreeNode { int val; struct T原创 2017-08-08 11:42:51 · 272 阅读 · 0 评论 -
剑指offer-左旋字符串
问题题目:[剑指offer-左旋字符串]思路矩阵求逆的思路。代码class Solution {public: string LeftRotateString(string str, int n) { std::reverse( str.begin(), str.begin() + n ); std::reverse( str.begin() + n, st原创 2017-07-24 18:44:29 · 396 阅读 · 0 评论 -
剑指offer-扑克牌顺子
问题题目:[剑指offer-扑克牌顺子]思路参考了[《剑指offer》-扑克牌顺子]主要思路就是求出0的个数,再求出所有数字之间两两的gap = arr[cur] - arr[pre] - 1. 如果0的个数小于gap的个数是不行的。还有,如果除了0之外任意两个数字相等,肯定无法形成顺子。代码class Solution {public: bool IsContinuous( vector原创 2017-07-24 20:22:18 · 336 阅读 · 0 评论 -
剑指offer-二叉搜索树的第k个结点
问题题目:[剑指offer-二叉搜索树的第k个结点]思路对于BST而言,最常见的遍历就是中序。因为可以递增序列,此时拿到第k个就可以了。代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x),原创 2017-08-08 20:41:35 · 286 阅读 · 0 评论 -
剑指offer-机器人的运动范围
问题题目:[剑指offer-机器人的运动范围]思路dfs+剪枝的常见思路。 注意,这个题是常规题目,上一道题目不太常规是因为它回溯之后,要恢复visited的未被访问的状态!!! 其实,正常的题目是不需要的。代码class Solution {public: int movingCount(int threshold, int rows, int cols) {原创 2017-08-11 17:30:10 · 355 阅读 · 0 评论 -
剑指offer-构建乘积数组
问题题目:[剑指offer-构建乘积数组]思路这个题目还是有一点难度的,很难考虑到。这个方法我也是参考了别人的方法。 对于,B[i]=A[0]A[1]…A[i-1]*A[i+1]…*A[n-1] 可以分成两部分:A[0]A[1]…A[i-1] 以及 A[i+1]A[i+2]…A[n-1]这两部分,而这两部分分别是连续的。 所以, 记 P[i] = A[0]A[1]…A[i-1] = P[i-原创 2017-07-27 21:06:50 · 254 阅读 · 0 评论 -
剑指offer-链表中环的入口结点
问题题目:[剑指offer-链表中环的入口结点]思路第一次相遇的地方,重置p,正常走,第二次相遇的地方就是环的入口。 小心没有环的情形。代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class原创 2017-07-27 20:25:32 · 262 阅读 · 0 评论 -
剑指offer-数组中重复的数字
问题题目:[剑指offer-数组中重复的数字]思路这个题我觉得其实它也没说清楚,看了注释才明白。 要得到所有重复的数字。 那我就判断一下,第一次重复数字出现的时候得到,通过first标记来判断是不是第一次。代码class Solution {public: // Parameters: // numbers: an array of integers原创 2017-07-26 20:45:17 · 274 阅读 · 0 评论 -
剑指offer-矩阵中的路径
问题题目:[剑指offer-矩阵中的路径]思路dfs+剪枝,也就是所谓的backtracking.实现的时候有一个技巧就是,只有确实某个(i,j)出现在路径中,visited[i][j]才会被值true。 然后,失败返回后重置为false。因为不能影响这次枚举其他枚举点的状态。比如: b->c->e->c这个路径是正确的。但是如果你直接b->c->f这个路径就错误。但是,由于还是是从b开始的局面,原创 2017-08-11 16:03:13 · 319 阅读 · 0 评论 -
剑指offer-滑动窗口的最大值
问题题目:[剑指offer-滑动窗口的最大值]思路暴力枚举窗口。代码class Solution {public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> ret; int sz = num.size(); if原创 2017-08-09 22:28:45 · 333 阅读 · 0 评论 -
剑指offer-字符串转化为数字
问题思路这个题,思路倒是不难。考虑的情形比较多啊。 我遇见的主要bug: 1. 只有1个符号的情形 2. 由于负数的得到是正数进行转化,所以,别忘了最后的转化 3. 考虑-2147483648,先提取正数部分,2147483648,已经溢出了。所以,需要long long 存储。 4. 还有就是,字符串表示的数字有可能已经溢出了比如,+4212344212这样的数字。返回0.代码class原创 2017-07-26 20:37:24 · 362 阅读 · 0 评论 -
剑指offer-把二叉树打印成多行
问题题目:[剑指offer-把二叉树打印成多行]思路保存每一层最后一个节点。 访问到它时进行更新操作。代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), righ原创 2017-08-03 21:49:44 · 274 阅读 · 0 评论 -
剑指offer-不用加减乘除做除法
问题题目:[剑指offer-不用加减乘除做除法]思路用位运算。 抑或操作可以实现无进位的加法。然后&操作左移,计算进位。 代码class Solution {public: int Add(int num1, int num2) { int carry = (num1 & num2) << 1;// 计算进位 int tmp = num1 ^ nu原创 2017-07-25 19:58:37 · 1623 阅读 · 0 评论 -
剑指offer-孩子们的游戏(圆圈中最后剩下的数)
问题题目:[剑指offer-孩子们的游戏]思路约瑟夫环的问题。 具体做法,考虑到删除,最好的办法是用循环链表。 但是,也没关系,用STL list即可。 小心迭代器失效的问题!!!其实,链表只是当前元素可能失效,但是迭代器可能到无效位置。代码class Solution {public: int LastRemaining_Solution(int n, int m) {原创 2017-07-25 19:55:22 · 296 阅读 · 0 评论 -
剑指offer-数据流中的中位数
问题题目:[剑指offer-数据流中的中位数]思路这个题目的意思是,数据流中一直有数据在插入,怎么样实时返回中位数。这个题目还是比较有实际意义,因为像在线系统一般都是实时插入数据。 这个题目是借助辅助数据结构,堆去完成。 对于一个数据,借助两个堆来进行排序,并且两者的元素之差始终不超过1个。 这个题目还是比较有技巧的! bug也改了我好长时间,就是要小心max_heap上来为空的情形,因此此原创 2017-08-09 22:13:26 · 319 阅读 · 0 评论 -
剑指offer-求1+2+3+...+n
问题题目:[剑指offer-求1+2+3+…+n]思路参考[浅谈《剑指offer》原题:求1+2+……+n]. 这个题目还是很有意思的,注意的是,如果需要写静态成员,起初我一直过不去,既然编译器你改不了,那证明还是你代码的问题。倘若是编译器问题,你也应该想思路搞定他。代码class Foo{public: Foo(){ ++cur; sum += cur; } static in原创 2017-07-24 20:54:07 · 265 阅读 · 0 评论 -
剑指offer-二叉树的深度
问题题目:[剑指offer-二叉树的深度]思路递归解决。代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/cla原创 2017-07-21 14:23:17 · 233 阅读 · 0 评论 -
剑指offer-连续子数组的最大和
问题题目:[剑指offer-连续子数组的最大和]思路这个题做了好几次了,套路应该是DAG模型的最短路。我不是很确定,但是我觉得类似。具体来说,状态定义的时候:dp[i]表示以array[i]结尾的连续数组最大和,因为题目要求是连续,所以我觉得一定要以array[i]结尾。至于最大,最后把状态数组扫描一遍即可。代码class Solution {public: int FindGreates原创 2017-07-17 20:22:20 · 280 阅读 · 0 评论 -
剑指offer-反转链表
问题题目:[剑指offer-反转链表]思路两种办法,头插法或者就地置逆。代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNod原创 2017-05-01 14:20:54 · 280 阅读 · 0 评论 -
剑指offer-数的整数次方
问题题目:[数的整数次方]思路我用的是一般的思路,只不过这个题目考察的情形比较多。 对于底数而言,有底数为0和底数不为0两种情形。 对于指数而言,有指数为0,指数大于0和指数小于0三种情形,均需要考虑。代码class Solution {public: double Power(double base, int exponent) { if( !equal( base,原创 2017-03-13 21:14:25 · 425 阅读 · 0 评论 -
剑指offer-二进制中1的个数
问题题目:[二进制中1的个数]思路不说了,位运算。 n&(n-1)消除最左侧1。代码class Solution {public: int NumberOf1(int n) { int ret = 0; while(n){ ret++; n = n&(n-1); }原创 2017-03-11 23:02:33 · 279 阅读 · 0 评论 -
剑指offer-矩形覆盖
问题题目:[矩形覆盖]思路先说我自己想的思路,主要分两种情形: 1. 全部竖着放,这是一种。 2. 至少有一种横着放,那么当N是偶数的情形,n= N/2;此时,所有的情况是C1n+C2n+...CnnC_{n}^{1} + C_{n}^{2} + ... C_{n}^{n},问题是奇数的情形,这种排列数我没想清楚,这个题最终还是栽在了数学上。还是,上来先想,锻炼思维是最重要的。代码(未AC)cl原创 2017-03-11 22:41:48 · 314 阅读 · 0 评论 -
剑指offer-替换空格
问题题目:[替换空格]思路这个题思路其实并不难,如果要是把题意说全的话。 但是我觉得这个题的关键点就是在这,起初我做的时候,以为是要自己开辟空间,可是又没法返回,我就尝试对于原来的str释放空间,可是人家是数组空间,不是动态开辟的,你还没法释放。所以,就想不到解决办法了。看了[剑指offer——替换空格]之后,才发现原来题意说的是空间给你充分的时候。但是,如果题目没有这么说,凭借自己的知识也应该猜原创 2017-02-26 22:10:57 · 278 阅读 · 0 评论 -
剑指offer-变态跳青蛙-DP
问题题目:[变态跳青蛙]思路和之前分析思路一样。记F[N]为调到第N层的方法。 对于第N-1层,可以1步跳过来。此时有F[n-1]种方法。 对于第N-2层,可以2步跳过来,此时有F[n-2]种方法。 … 对于第1层而言,可以N-1步跳过来,此时有F[1]种方法。 对于第0层而言,可以N步跳过来,此时有1种方法代码class Solution {public: int jumpFl原创 2017-02-11 15:22:17 · 396 阅读 · 0 评论 -
剑指offer-旋转数组的最小数字
问题题目:[旋转数组的最小数字]思路需要注意这几个点:旋转数组将原数组分为两部分,前面的有序子数组和后面的有序子数组前面的有序子数组比后面的有序子数组大。这是基本的性质。所以对于旋转后的数组,一定有第一个元素比最后一个元素大的性质。当然,存在例外的情形。 旋转0个,就是原数组。[1,0,1,1,1]和[1,1,1,0,1]的情形。此时无法确定中间的元素到底数组第一个还是第二个数组,因此会导原创 2017-03-03 22:32:06 · 209 阅读 · 0 评论 -
剑指offer-重建二叉树
问题题目:[重建二叉树]思路老问题了,递归建立。 基本思路是,根据先序中的第一个节点。到中序序列去进行划分左右子树。 然后递归建立左右子树即可。代码/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2017-03-03 21:15:49 · 196 阅读 · 0 评论