剑指offer刷题笔记
刷题
FXY.jpg
这个作者很懒,什么都没留下…
展开
-
动态规划法
为什么不用递归:因为递归进行计算的时候会产生较多的重复计算,例如求斐波那契数列fib(8),中间的fib(5),fib(4),fib(3),fib(2)等重复计算了好多次,导致不必要的计算,当然可以用一个数组来储存计算过的值,这样也是一种优化思路。动态规划的主要的思路是先建模,建立一个金字塔模型用于分析问题,确定状态。然后从下往上计算,用一个数组储存计算过的底层的最优解,最后数组最后一个值...原创 2020-02-18 09:30:17 · 106 阅读 · 0 评论 -
面试题12——寻找矩阵中的路径
题目:判断一个二维矩阵中是否存在一条特定的字符串路径。自己的思路:完全没有思路书中给的思路:回溯法,我专门写了一个回溯法的。对照着书把代码撸了一遍大致了解了回溯法的思想:#include<iostream>using namespace std;bool hasPath(char *matrix, int rows, int cols, char *str){ ...原创 2020-02-15 16:38:19 · 276 阅读 · 0 评论 -
面试题11——旋转数组的最小值
题目:把一个有序数组的末尾几位移到最开始的位置形成的新的新数组成为旋转数组,找出数组的最小值。自己思路:查找的话离不开遍历,二分,哈希,二叉搜索树。这题用遍历可以解决,但是太耗费时间了。旋转数组的特点:前面的有序序列必然大于后面的有序序列(假设数组之前是升序排列),可以根据二分进行查找。代码:二分查找的递归实现:#include<iostream>using namesp...原创 2020-02-15 11:49:11 · 157 阅读 · 0 评论 -
面试题10——斐波那契数列
斐波那契数列的定义:每一项都是前两项的和。自己思路:1、脚趾头想都是递归,基本每个算法书讲递归的时候必然会举斐波那契的例子。但是这是面试题,应该不会这么简单,递归太耗时间了,考官应该会想节省时间的方法。2、想起来递归,非递归可能要用到栈来实现递归。具体面试的时候用哪种思路,可以和面试官讨论具体的细节,然后选择符合面试官要求的方法。递归思路:#include<iostream>...原创 2020-02-14 23:24:18 · 199 阅读 · 0 评论 -
面试题9——两个栈实现一个队列
自己的思路:主要思路是一个栈当主要的执行操作,另一个作为辅助栈。有两种思路:主要栈的栈顶即为队列的头,栈底为队列的尾。另一种反过来,栈顶为尾,栈底为头。直接写代码:把栈顶当作队列的尾#include<stack>#include<iostream>using namespace std;stack<int> s1;stack<int&g...原创 2020-02-14 22:49:43 · 132 阅读 · 0 评论 -
面试题8——寻找二叉树的下一个节点
题目要求:给定一棵二叉树和一个节点,找出这个节点在中序序列中的下一个节点。自己的思路:1、可以根据中序遍历构建一个中序线索二叉树,然后所有结点的中序遍历的前一个节点和后一个节点都可以找出来了。2、根据中序遍历的特点,找出所有的可能性,既可以判断中序遍历的下一个节点。实现代码:#include<iostream>#include<string>#include...原创 2020-02-14 21:54:39 · 143 阅读 · 0 评论 -
面试题7——重建二叉树
题目:给定一个二叉树的前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},重构这棵二叉树。自己的思路:1、看到树应该想到的是递归,树和递归基本是分不开的,那么我们可以通过前序遍历确定树的根节点以及子树的根节点,然后遍历中序序列找到根节点,依据中序序列的特点,在根节点左边的是左子树,在根节点右边的是右子树。以此递归即可实现代码:#include&l...原创 2020-02-14 17:42:49 · 173 阅读 · 0 评论 -
面试题6——倒序输出链表
思路有两个:1、利用递归思路,这样比较耗时,但是省空间。2、既然能够使用递归,就能使用栈来操作。首先要涉及到链表的定义和初始化:struct LinkNode{ int value; LinkNode *next; LinkNode(int value1, LinkNode *next1 = nullptr){ value = value1; ...原创 2020-02-14 09:47:51 · 125 阅读 · 0 评论 -
面试题5——替换空格
题目要求:将字符串中的空格替换成%20自己的思路:1、空间换时间,申请一个新的字符串,将原有的字符串挨个复制过来,并且遇到空格时替换%20。2、减少空间消耗,在原有字符串上直接替换,题目就类似于一个字符数组进行位置的移动,一个元素被三个元素替换。...原创 2020-02-14 08:46:27 · 112 阅读 · 0 评论 -
面试题4——二维数组中的查找
自己想出来的思路:1、暴力搜索二维数组,时间复杂度为O(n^2)。2、对每一行进行二分搜索,时间复杂度为O(nlog(n))。3、从第一行中找出大于搜索数字的的列剔除,从第一列中找出大于搜索数字的行剔除。在剩下的二维数组中进行每一行的二分搜索。时间复杂度还是O(nlog(n)),但是算法的执行速度应该会比较快。第二种思路的代码:#include<iostream>using...原创 2020-02-12 17:31:37 · 153 阅读 · 0 评论 -
面试题3——寻找数组中的重复数字
1、先排序,再直接找重复数字(思路比较简单)2、空间换时间思路:找一个临时数组类似于哈希表的操作,用于记录第i数字的个数。时间复杂度是O(n),空间复杂度是O(n)3、交换法:判断第i个位置上面的数字j是否和第j个位置上面的数字相等,如果相等就说明有重复的数字出现,接着判断i+1的位置,如果不相等就交换i和j的数字,直到位置i上面的数字j和第j个位置上面的数字是相等的。时间复杂度是O(n)...原创 2020-02-12 11:34:32 · 184 阅读 · 0 评论