新年礼包哈哈哈 年前最后一次学习了

年前最后一次学习了,过节过节,到时候我们春节过后再来大展宏“兔”
今天给大家带来三道剑指offer的题 分别是
1.圆圈中最后剩下的数字
2. 二叉树的最近公共祖先
3.二叉搜索树的最近公共祖先

1.题目和代码
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

class Solution {
public:
    int lastRemaining(int n, int m) {
        int res = 0;

        for(int i = 2; i <=n ; i++)
        {
            res = (res + m) % i;
        }

        return res;
    }
};

2.题目和代码
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == NULL || root == p || root == q) return root;

        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);

        if(left && right) return root;

       return left == NULL ? right : left; 
    }
};

3.题目和代码
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        while(root)
        {
            if(root->val > p->val && root->val > q->val)
            {
                root = root->left;
            }
            else if(root->val < p->val && root->val < q->val)
            {
                root = root->right;
            }
            else
            {
                return root;
            }
        }

        return NULL;
    }
};

祝大家在新的一年能够身体健康,平安喜乐,学业有成,早日拿到自己心仪的offer。
爱你们哦,我们一直在路上!

你可能感兴趣的:(刷题,学习,算法,数据结构)