![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
nwpubear
独善其身
展开
-
最低公共祖先
最低公共祖先方法一:递归实现 对于树中两个节点而言,最低公共祖先LCA其实就是该节点左边和右边分别包含A,B两个节点。只有A,B分别在其左右子树中。首先判断该节点是否非空,空返回NULL,表示既没有A,有没有B如果该节点本身是A,或者B中的一个则返回该节点递归的判断该节点的左右子树,如果左右子树都不是返回NULL,说明左右子树分别包含A,B那么就可以返回root。(注意,这...原创 2018-08-06 22:42:53 · 490 阅读 · 0 评论 -
最大连续子数组和
最大连续子数组和 动态规划,迭代求出以i结尾的最大连续和,i+1结尾的最大连续和时和前一位的状态有关,列出递推式即可求解class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { //动态规划,其实就是求最大和的连续子序列 //列出递推式,即可做,假...原创 2018-09-02 21:00:09 · 187 阅读 · 0 评论 -
1到n中1出现的次数
1到n中1出现的次数参考链接https://www.cnblogs.com/lengender-12/p/6876897.html右边第i位出现的1的次数的权重是pow(10,i-1)该位置左边的数字乘以该权重为p1修正值就是需要判断该位置上是否大于1,或者等于1如果大于1,那么还需要增加一个单位的权重如果等于1,需要增加i右边的数字的个数class Solution ...原创 2018-09-02 13:21:28 · 164 阅读 · 0 评论 -
字符串的全排列
递归解法,第一个元素拿出来,求出后面的全排列需要注意相同的元素不替换但是只是相同的元素不替换不能保证所有的不重复,还需要去重去重需要先排序,再返回去重index,然后erase即可。class Solution {public: //递归解法 vector<string> Permutation(string str) { vector&...原创 2018-09-07 23:10:21 · 343 阅读 · 0 评论 -
数组排成最小的数
把数组排成最小的数假定两个想邻的数字m,n如果拼接处mn<=nm那么m在n的前面,定义为m<=n;否则定义为nclass Solution {public: string PrintMinNumber(vector<int> numbers) { sort(numbers.begin(),numbers.end(),compare); ...原创 2018-09-01 22:54:29 · 165 阅读 · 0 评论 -
寻找丑数
寻找丑数 丑数一定是前面的某个数乘以2或者3或者5得到的,在这个基础上可以进行数学归纳法证明其正确性。为了能够迭代的构造这个数列,需要记录当前2,3,5作为乘数因子大于数组最末端的数组的位置 1. 设置p2,p3,p5均是0, 2. 设置当前数组第一个元素为1 3. 迭代开始,每次都保证array[p2]*2,array[p3]*3,array[p5]*5都大于array的末端元素,取最...原创 2018-09-01 22:32:50 · 230 阅读 · 0 评论 -
判断一个有序数组中一个数字重复出现的次数
判断一个有序数组中一个数字出现的次数 首先可以想到二分法,但是二分法只是找到其中一个的位置,这个时候不能确定个数 为了能够确定个数,可以有一个简单的方法,一个一个往前数,一个一个往后面数,直到数到边界为止,代码如下class Solution {public: int GetNumberOfK(vector<int> data ,int k) { ...原创 2018-08-21 21:49:39 · 4408 阅读 · 0 评论 -
如何判断一个树是否是平衡二叉树
判断一个树是二叉平衡树 平衡二叉树十是一种高度自平衡树,它的任何一个结点的左右子树的高度之差不会查过1。递归方法:从定义个就可以写出一个递归的解法,先求左右子树是否平衡然后,再判断自己是否平衡。代码如下class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(pR...原创 2018-08-21 21:07:27 · 2679 阅读 · 0 评论 -
二叉树的下一个节点
思路:主要是分为三种情况 1. 该节点有右子树 2. 该节点无右子树,无父节点 3. 该节点无右子树,有父节点,是父节点的左子树 4. 该节点无右子树,有父节点,是父节点的右子树class Solution {public: TreeLinkNode* GetNext(TreeLinkNode* pNode){ //节点不存在,返回NULL ...原创 2018-08-23 14:38:22 · 196 阅读 · 0 评论 -
判断对称二叉树
思路:对于一个树,如果它的左右子树是成镜像的,那么就说明这个树是对称二叉树。 一个树与另外一个树是否是镜像,首先需要判断两个根节点是否一致(都为NULL或者都不为NULL相等),在根已经一致的情况,分别递归判断第一个树的左子树和第二个树的右子树,第一个树的右子树和第二个树的左子树。class Solution {public: bool isSymmetrical(...原创 2018-08-22 21:39:27 · 723 阅读 · 0 评论 -
两个链表第一个相交的点
思路一:两个链表长度,长的先走比短的多的那部分,再两个一起走,相遇就是那个节点//求出两个链表的长度,然后让一个先走diff步,两个一起走相遇就是第一个公共节点class Solution {public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pH...原创 2018-08-22 19:42:50 · 110 阅读 · 0 评论 -
数组中的逆序对
采用归并排序的思路,参考剑指offer,但是注意剑指offer是有错误的,那就是在递归中没有对原数组排序。算法如下所示,代码注释中有说明。class Solution {public: long long InversePairs(vector<int> data) { int *copy=new int[data.size()]; lo...原创 2018-08-22 19:39:44 · 103 阅读 · 0 评论 -
查找在一个序列中只出现一次的数字
主要考察异或运算 1. 全部异或得到结果的二进制是1的那一个位置 2. 两个数字必然在那一位也是为1,为0 3. 全部的数字的二进制同样位置上为1的进行异或,得到一个结果 4. 全部的数字的二进制同样位置上为0的进行异或,得到另一个class Solution { //先全体异或,找到这个结果是1的位置index,index从右边往左边(低位到高位,从0...原创 2018-08-16 20:59:04 · 693 阅读 · 0 评论 -
连续子序列的和为s的数字及其扩展
连续子序列和为s的数字 为了能够得到线性时间复杂度的算法,可以考虑两个标记,一个指向头部,一个指向尾部 1. 和大了就++head 2. 和小了就–tailclass Solution { //和为sum的两个数字,因为这是个有序的序列,自然需要利用public: vector<int> FindNumbersWithSum(vector<...原创 2018-08-16 20:55:25 · 677 阅读 · 0 评论 -
左旋转字符串以及扩展
翻转字符串 翻转一个字符串中的单词顺序,只需要 1. 翻转字符串 2. 翻转单词class Solution {//左旋转某个有序的东西,只需要先反转整体,让内部元素整体归位,然后在局部反转,让内部元素的每个元素归位public: string ReverseSentence(string str) { int begin=0; ...原创 2018-08-23 14:39:17 · 140 阅读 · 0 评论 -
如何计算1+2+3+...+n的值
利用函数数组 不能使用递归,但是可以使用两个函数的数组,随着n到0选择基准函数,其他时候选择调用下降函数//使用一个函数指针数组,装下递归基函数和递归下降函数//关键在于如何选择函数,在0时候选择基准,非0时候选择下降typedef int (*fun) ( int); //定义函数指针类型class Solution {public: static int S...原创 2018-08-07 19:36:06 · 3063 阅读 · 0 评论 -
不用加减乘除做加法
不用加减乘除做加法 不用加减乘除做加法其实就需要利用位运算来进行,有两点需要注意1. sum=num1^num2;2. carry=(num1&num2)<<1;class Solution {public: int Add(int num1, int num2) { while(num2!=0){ ...原创 2018-08-07 17:58:30 · 100 阅读 · 0 评论 -
完成字符串到整数的转换
字符串到整数的转换 可以考虑对于原有的atoi的实现,不仅仅需要计算得到数值,对于其中的特殊情况需要进行仔细斟酌,区分,提高程序的鲁棒性。首先字符串首字符可以是正负首字符是正负的时候,后续必须得有非空的数字字符串,否则返回0,其余遇到非数字字符的情况都是判错,返回0。对于”0”返回0,为了区分两种0,需要添加一个全局或者传入的区分变量,本文不讨论该种情况,但是需要知道。空字...原创 2018-08-07 17:32:11 · 188 阅读 · 0 评论 -
#最小的k个数
最小的k个数字快排分治的方法进行计算 1. 快排一次得到中间枢纽位置,比较在k-1后面还是前面 2. 若是index>k-1,那么就对[left,index-1]在进行快排 3. 若是indexclass Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> inp...原创 2018-09-06 20:40:57 · 148 阅读 · 0 评论