剑指Offer
程程程乘什么
这个作者很懒,什么都没留下…
展开
-
剑指Offer 38:字符串的全排列
解法一:完全按照之前回溯法专题总结中,有重复元素数组的全排列方法来做,string也可以看做是一种数组(因为一开始陷入了对未排序 string 进行回溯+剪枝的思路,尝试了引入set等方法都半途折戟。最后还是要排序)class Solution {public: vector<string> permutation(string s) { sort(...原创 2020-05-06 16:40:43 · 161 阅读 · 0 评论 -
剑指Offer 16:简单快速幂|板子题
第一种写法:递归形式、二分思想class Solution {public: double myPow(double x, int n) { if(n == 0) return 1; if(n == 1) return x; if(n == -1) return 1/x; if(n % 2 == 0) { ...原创 2020-04-04 23:00:07 · 91 阅读 · 0 评论 -
回溯法系列:全排列系列问题、N皇后问题、矩阵中的路径、机器人的运动范围
class Solution {public: vector<vector<string>> solveNQueens(int n) { //vector<vector<string>> ans; vector<string> board(n, string(n, '.')); //初始化n*n...原创 2020-04-06 23:33:49 · 292 阅读 · 0 评论 -
面试题14:剪绳子
14-1:DP做法,思路比较好class Solution {public: int cuttingRope(int n) { if(n <= 1) return 0; vector<int> dp(n+1, 1); for(int i = 2; i <= n;...原创 2020-03-27 16:56:50 · 148 阅读 · 0 评论 -
剑指Offer 64:滑动窗口的最大值
这道题一个月之前在LeetCode上做过https://blog.csdn.net/chengda321/article/details/104150828然而在思路上卡了2个地方(想到用单调队列,想到队列存放索引而不是数值)在实现上也出现了好几处漏洞:初始化第一个窗口之后就要把第一个窗口的结果保存,之后的遍历从第二个窗口开始就可以了。以及窗口的更新:比较的是新加入的最后一个元素,而...原创 2020-03-07 12:33:30 · 91 阅读 · 0 评论 -
剑指Offer:52 正则表达式的匹配
1、递归的灵活运用,尤其是多种情况下如何递归返回2、字符串的基本性质:char* str 向后移动不能str++,必须str+13、各种情况考虑必须严谨,不然很容易漏掉一些可能通过的匹配模式,比如:(1)'*'前字符相同也可以跳过不匹配;(2)pattern为'.'时要匹配还需要此时str不为'\0'class Solution {public: bool match...原创 2020-02-12 12:38:56 · 109 阅读 · 0 评论 -
剑指Offer:37 二叉树的序列化
这道题是今天做的5道二叉树习题中最难的一道了,主要因为对C++/C中的几种字符串的操作不熟悉,花了很多时间理清楚语法基础:C++ 字符串与字符数组 详解/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : ...原创 2020-02-12 00:27:53 · 101 阅读 · 0 评论 -
剑指Offer :63 数据流中的中位数
很经典的一道题,书上的思路解析也非常好。面对这样的数据流问题,首先需要建立容器存储数据流:(1)数组、链表排序数组:插入时间复杂度为 O(n),查找为O(1);无序数组:插入时间复杂度 O(1),查找为O(n)排序链表:插入时间复杂度 O(n),查找为O(1)(2)二叉搜索树 BST平均情况下(左右子树比较平衡),插入为O(logn),查找中位数也是O(logn)最差的情...原创 2020-02-11 21:48:52 · 94 阅读 · 0 评论 -
LeetCode:62 二叉搜索树第K小的节点
这道题不久前在LeetCode上做过,二叉搜索树的中序遍历序列就是单调递增的。解法:递归的中序遍历,遍历到第k个节点结束递归返回;结果也作为参数列表的一部分:这是递归调用不知道如何返回结果时的一种变通的做法。注意 result 初始化为 nullptr,这样不足k个节点时,会返回nullptr。class Solution {public: TreeNode* KthNode...原创 2020-02-11 18:20:34 · 125 阅读 · 0 评论 -
剑指Offer:59 之字形打印二叉树
按照书上的解题思路,采用两个栈做辅助数据容器,逐层打印。And,清空vector的三种方法都可以使用,layer.clear() 最简洁。class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>>...原创 2020-02-11 12:27:59 · 84 阅读 · 0 评论 -
剑指Offer:60 分层输出二叉树
这道题是二叉树层序遍历的升级版,需要额外的两个变量存储当前层、下一层的节点数。出现的一个Bug:把判断当前层的节点数量的 if 判断放在了向队列添加当前节点左右儿子节点的前面:这样会造成,这一层加入结果 ret 后,下一层的节点数更新不正确,因为此时 next_layer 还没有更新!一个语法知识点:vector容器的清空要掌握:C++ vector清空元素的三种方法clas...原创 2020-02-11 11:56:13 · 144 阅读 · 0 评论 -
剑指Offer:58 判断是不是对称的二叉树
第一次自己做,思路出现了问题:对称二叉树不是一棵树的左右子节点相等,而是反转二叉树之后和原二叉树一样!class Solution {public: bool isSymmetrical(TreeNode* pRoot) { if(!pRoot) return false; bool flag = true; postorde...原创 2020-02-08 16:39:08 · 172 阅读 · 0 评论 -
剑指Offer:8 二叉树中序遍历的下一个节点
class Solution {public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if (!pNode) return nullptr; //节点有右子树,访问右子树的最左节点 if (pNode->right) { pNode = pNode-...原创 2020-02-08 13:14:05 · 90 阅读 · 0 评论 -
剑指Offer:12 数值的整数次方
简单快速幂:https://blog.csdn.net/aston5128/article/details/53485752这篇博客中提到了三种简单快速幂的方法,我用后两种做了一下这道题。采用二分法思想的递归实现:class Solution {public: double Power(double base, int exponent) { if (ex...原创 2019-05-03 23:09:27 · 100 阅读 · 0 评论 -
剑指Offer:41 和为S的连续正数序列
双指针法,指针均单向移动,求和:内存超限:您的程序使用了超过限制的内存,case通过率为0.00%class Solution {public: vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int>> result; ...原创 2019-10-06 18:16:55 · 116 阅读 · 0 评论 -
剑指Offer:55 二叉树的深度/判断平衡二叉树
平衡二叉树,就是左子树深度和右子树深度差最多为1,沿用上一题38题的判断树的深度的代码,就可以AC但是其实代码是错误的,因为:只是判断了根节点的左右子树深度差,而平衡二叉树要求任意节点的左右子树高度差不超过1class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(pRoot=...原创 2019-10-06 17:24:19 · 111 阅读 · 0 评论 -
剑指Offer:38 二叉树的深度
一开始想用层序遍历的方法做,写完了层序遍历的函数 (很久没做二叉树了有点生疏),才发现这样求出来的depth是整棵树的节点个数,而不是深度。 int LevelOrderTraversal(TreeNode* pRoot) { int depth = 0; queue<TreeNode*> Queue; Queue.p...原创 2019-10-06 10:57:03 · 67 阅读 · 0 评论 -
剑指Offer:40 数组中只出现一次的数字
位运算的典型题目,利用好两个相同的数字异或为0,任何数字和0异或都为原数字这两个性质即可。思路:全部异或,以为1的位为标准,按照0/1将其分为两组,这两组中各包含一个只出现一次的值,其他出现两次的同一个数字一定被分到同一组。然后两组分别异或即可。class Solution {public: void FindNumsAppearOnce(vector<int> d...原创 2019-10-06 17:52:19 · 59 阅读 · 0 评论 -
剑指Offer:37数字在排序数组出现的次数
C++版本:第一次提交的代码:(bool变量的声明要放在if语句的外面,否则有的编译器会报错,认为没有声明up变量)通过率72.73%class Solution {public: int GetNumberOfK(vector<int> data ,int k) { if (data.empty()) return 0; //...原创 2019-09-24 22:49:47 · 78 阅读 · 0 评论 -
剑指Offer:42 和为S的两个数字
和41题类似,但是更简单一些,直接双指针法就可以。要求返回乘积最小的一组,其实就是第一组,因为和一定时,两数相差越大积越小;或者可以在所有结果找完之后,for循环找乘积最小的一组。class Solution {public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { ...原创 2019-10-06 18:31:30 · 72 阅读 · 0 评论 -
剑指Offer:43 左旋转字符串
对字符串的操作还不太熟悉,其实字符串就是char字符的数组,以‘\0’结束左旋转字符串,是翻转字符串的变形,思路类似:都是先整体翻转,再分段再翻转回来。class Solution {public: string LeftRotateString(string str, int n) { if(str.size()<=1) return str; ...原创 2019-10-06 20:49:39 · 83 阅读 · 0 评论 -
剑指Offer:44翻转单词顺序(翻转字符串)
和43题类似,也是翻转字符串,写完程序有4处Bug,最大的两个错误在于:1、写Reserve函数时不动脑子,把end--写成了end++,导致数组越界,段错误(检查了很久都没检查出来)2、 又一次忘记了将 指针/索引 在用完后移动:每翻转完一次,begin指向end指的空格,end需要往后错一位,不然end一直满足<str.size() 且 !=‘ ’ ,陷入外层的死循环3、忘记...原创 2019-10-06 22:40:20 · 88 阅读 · 0 评论 -
剑指Offer:45 扑克牌中的顺子
第一种思路:1、先排序2、统计0的个数,检查有没有其他重复的数 3、看缺的牌数是不是小于等于0的个数class Solution {public: bool IsContinuous( vector<int> numbers ) { if(numbers.size()!=5) return false; //1、排序 s...原创 2019-10-07 12:45:35 · 81 阅读 · 0 评论 -
剑指Offer: 46 约瑟夫环问题
因为对STL中的 list 容器和 iterator 迭代器的使用不熟悉,花了很多时间现补知识。最开始的代码会报段错误,如果把 iter++ 放在erase里面就不会报段错误,但还是会返回错误的结果。 int LastRemaining_Solution(int n, int m) { if(n<=0 || m<=0) return -1; ...原创 2019-10-07 16:30:53 · 124 阅读 · 0 评论 -
剑指Offer:48 不用加减乘除做加法
三步走:1、不考虑进位的加法:异或2、单独考虑进位的结果:位与,然后左移一位3、将前两个结果加和,加和的方法还是一样:重复1-2两步骤做循环。直到没有进位产生。class Solution {public: int Add(int num1, int num2) { int sum; int carry = 1; //随便一个初...原创 2019-10-07 18:44:21 · 85 阅读 · 0 评论 -
剑指Offer 36:两个链表的第一个公共结点
C++ 版本:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNo...原创 2019-09-23 21:57:41 · 68 阅读 · 0 评论 -
剑指Offer:34 第一个只出现一次的字符
看完题目后,我的第一反应就是应该用Hash表做,看了一眼讨论区都是用的Hash表,心里就有底了。然后进一步理清了思路:字符为key,出现次数为value,第一次遍历一遍字符串,把所有字符和对应的出现次数存入哈希表;第二次顺序遍历字符串,对每一个字符查询出现次数,第一个次数为1的就返回。代码如下:(这是为数不多的一次思路和代码实现都没有看书和别人的代码的)ps:代码有漏洞,没有处...原创 2019-07-04 22:21:41 · 69 阅读 · 0 评论 -
剑指Offer:18 二叉树的镜像
这道题思路比较简单:遍历二叉树,左右节点互换就可以了。采用递归的方式,当一个节点的某一子节点(左或右)为NULL时就结束对这一子节点的递归。缺点是时间上比较浪费:一个节点两个子节点都为NULL的情况下就不需要互换了,直接return就可以,所以可以加上这一句判断。/*struct TreeNode { int val; struct TreeNode *left; stru...原创 2019-06-08 17:03:28 · 87 阅读 · 0 评论 -
剑指Offer:33 二叉搜索树的后序遍历序列
涉及到自己之前不了解的数据结构:二叉搜索树,其实就是满足二叉树的左子树的key值<根节点的key值<右子树的key值,即为二叉搜索树。这道题本身和二叉搜索树的操作并没有关系,只是让判断一个线性序列是否满足二叉搜索树的后序遍历规律。看完书上的思路之后,还是没有办法转化为代码,又大致用十几秒浏览了下书上的程序大体结构,之后自己边写边改,还算比较顺利,第一次写完出了一处Bug:对j的...原创 2019-06-13 23:08:09 · 106 阅读 · 0 评论 -
剑指Offer:17 树的子结构
对二叉树的题还不是很熟练,做的太少了。 这次看了书上的解法之后,自己再写了一遍,还是出了几个小问题,就是下面程序中注释掉的两处:1、不应该把那两行加在else下,因为根节点相同、但后续节点不同时,下面还要继续递归找下去。2、比较鸡肋的错误,注释与否关系不大,把return都放在if判断里,编译器会报错。注意:在使用指针的时候一定要注意边界条件,即检查空指针。当树A或树B为空的时候,定义...原创 2019-06-07 17:36:25 · 99 阅读 · 0 评论 -
剑指Offer:16 合并两个排序的链表
之前PTA做过类似的题目,当时那道题应该是每次新建一个节点,这次利用的原本存在的节点构成了合并后的链表。几点注意:1、空的头节点最后要删去,用delete删去 2、构造空的头节点时,要传递构造函数(constructor)要求的参数,一开始没有加参数,报错,加参数之后通过运行。/*struct ListNode { int val; stru...原创 2019-06-06 21:52:44 · 82 阅读 · 0 评论 -
剑指Offer:15 反转链表
之前做过的题目,三个指针配合完成反转链表,回忆+写一共用了不到15分钟。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(Lis...原创 2019-06-06 21:52:25 · 71 阅读 · 0 评论 -
剑指Offer:14 链表中倒数第k个结点
这道题没有看解答,自己试着做了一下,处理链表个数小于k的情况时一开始不知道如何处理,就返回头指针;看了不通过的测试用例才明白,直接返回NULL就好了。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {...原创 2019-06-05 22:31:45 · 78 阅读 · 0 评论 -
剑指Offer:8&9 跳台阶/变态跳台阶
昨天因为画PCB画到太晚没有做题,今天补上昨天的。这2道题从动态规划的角度来看,有一个很好的漫画图解动态规划:https://www.sohu.com/a/153858619_466939剑指Offer第8题是很简单一个题,看完题目第一反应就是递归,很快写完一遍过,但是用时600-700ms左右:(这和上面链接中提到的第1种解法:简单递归解法是一致的)class Solution...原创 2019-04-30 22:16:40 · 131 阅读 · 0 评论 -
剑指Offer:3 反转链表
反转链表,之前在PTA做过的,写完之后发现出现段错误,检查一下发现是第一个头节点没有把next 指针置NULL,加上之后就通过了。另外要注意结构体定义的构造函数,默认是NULL,而不是null,所以判断链表是不是到最后,要和NULL比较而不是null。/*** struct ListNode {* int val;* struct ListNode ...原创 2019-04-24 22:09:13 · 78 阅读 · 0 评论 -
剑指Offer:11 二进制中1的个数
之前没有做过位运算的题目,这次直接看书上的思路做的,两种做法:第一种比较直观,但是有缺陷。(循环条件选取的有一些问题)第二种时间复杂度更低。class Solution {public: int NumberOf1(int n) { int count=0; unsigned int flag=1; while(f...原创 2019-05-03 21:41:19 · 86 阅读 · 0 评论 -
剑指Offer:7 斐波那契数列
这道题可以用递归做,不过时间复杂度太高,用循环做更合适。题目比较简单,几分钟写完一遍过。class Solution {public: int Fibonacci(int n) { if(n==0 || n==1){ return n; } int one, two, nFib; one ...原创 2019-04-28 19:30:24 · 123 阅读 · 0 评论 -
剑指Offer:2 替换空格
字符串是字符的顺序存储,也就是字符数组。这道题是先看了书上的思路之后做的,一开始用char*指针遍历出现报错。之后看了书上的具体实现,用数组索引的方式代替,顺利通过。通过的代码:class Solution {public: void replaceSpace(char *str,int length) { if(str==nullptr || length<=...原创 2019-04-23 22:48:14 · 106 阅读 · 0 评论 -
剑指Offer:6 旋转数组的最小数字(二分法的应用)
一开始想要用二分法,但不知道如何处理, 之后看了书上的处理思路,然后自己动手写代码,一遍过。对基本方法的灵活应用还是很重要的。主要是二分查找的循环终止条件和左右边界的每次的调整和经典二分查找有所改动。也可以用其他查找方法试一试,对比一下效果。class Solution {public: int minNumberInRotateArray(vector<int&...原创 2019-04-27 21:50:48 · 86 阅读 · 0 评论 -
剑指Offer:10 矩形覆盖
今天这道题还是一道递归和循环题,换汤不换药,读题加写程序一共用了2-3分钟左右。最近这两天做的题有点儿水啊……递归写法:class Solution {public: int rectCover(int number) { if (number<=0) return 0; //写-1通不过 if (number==1) return 1...原创 2019-05-01 22:43:03 · 95 阅读 · 0 评论