剑指Offer
RadiumYang
ACM退役打牌选手
展开
-
剑指Offer——数组中的逆序对
剑指Offer——数组中的逆序对题意在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。分析先离散化再,利用树状数组。首先先计算出每个数最后排完序所在的位置,用一个map来存储。然后动态加点,每次把每个数该在的位置上加上1,若一个数该在的位置为x,则在x位置加上1。用query(x)查询1-x的和,也就是之前(包括自己...原创 2020-04-14 22:08:20 · 156 阅读 · 0 评论 -
剑指Offer——二叉树的最近公共祖先
剑指Offer——二叉树的最近公共祖先题意给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”分析如果当前节点就是p或q直接返回如果左子树和右子树有p和q返回当前节点如果只有一边有那就任然返回p或者q递...原创 2020-04-14 21:44:36 · 218 阅读 · 0 评论 -
剑指Offer——队列的最大值
剑指Offer——队列的最大值题目描述请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1想法和栈的最大值类似,栈是用两个栈来实现,不过队列略微有些不同,我们需要一个双向链表来维护这个队列的最大值。双向链...原创 2020-04-14 21:20:53 · 203 阅读 · 0 评论 -
剑指Offer——最小的k个数
最小的k个数题目描述输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。想法复习一下快排,快排的核心就是先找一个基准数(一般为第一个),然后将所有比基准数小的数字放到自己左边,大的放右边。然后递归操作左边和右边。具体的操作是设置两个指针分别指向头和尾,然后不断缩小左右边界,如果出现大的数字在左边就放到右边...原创 2020-04-11 21:22:16 · 121 阅读 · 0 评论 -
剑指Offer——1~n整数中1出现的次数
剑指Offer——1~n整数中1出现的次数题目描述输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。想法这个题目应该是比较明显的一个数位dp,只不过我忘的差不多了,贴一个讲的很好的数位dp。https://blog.csdn.net/jk211766/article/details/...原创 2020-04-10 18:59:54 · 183 阅读 · 0 评论 -
剑指Offer——数值的整数次方
数值的整数次方题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。想法快速幂,不过此时要考虑一下n为负的情况,而且n取反时可能会爆int,同时还可以加两个特判。代码class Solution {public: double myPow(double x, i...原创 2020-04-05 09:07:08 · 154 阅读 · 0 评论 -
剑指Offer——和为S的连续正数序列
和为S的连续正数序列题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和...原创 2020-02-14 13:50:32 · 155 阅读 · 0 评论 -
剑指Offer——数字在排序数组中出现的次数
数字在排序数组中出现的次数题目描述统计一个数字在排序数组中出现的次数。想法二分找到第一个等于k的位置,和第一个大于k的位置,做差就是出现次数。直接调lower_bound()和upper_bound()。代码class Solution {public: int GetNumberOfK(vector<int> data ,int k) { aut...原创 2020-02-13 20:36:35 · 106 阅读 · 0 评论 -
剑指Offer——二叉树的下一个结点
二叉树的下一个结点题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。想法要求的是中序遍历的下一个结点,中序遍历的顺序是左根右。那么会有3种可能。有右孩子,那么下一个就是右孩子的最左下角的孩子无右孩子,是父节点的左孩子。那么下一个就是父节点。无右孩子,是父节点的右孩子。那么下一个就是父节点一直...原创 2020-02-13 19:59:35 · 164 阅读 · 0 评论 -
剑指Offer——平衡二叉树
平衡二叉树题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。想法平衡二叉树定义如下:平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。满足平衡二叉树有两个条件:左右子树高度差不超过1左右子树都是平衡二叉树所以再写一个求树高的函数即可。代码class Sol...原创 2020-02-13 14:24:45 · 117 阅读 · 0 评论 -
剑指Offer——从上往下打印二叉树
从上往下打印二叉树题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。想法二叉树层次遍历,一个bfs。代码class Solution {public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int> ans; queue<Tr...原创 2020-02-13 13:26:11 · 92 阅读 · 0 评论 -
剑指Offer——包含min函数的栈
包含min函数的栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。想法通过另外一个栈来保存当前栈的最小值。而这个最小值在它被pop时就不再有效,此时有效的最小值是上一个最小值(因此我们需要将最小值存在栈中,以便当前最小值被删除时恢复上一个最小值)。代码class Solution {public: stack<...原创 2020-02-13 13:19:55 · 170 阅读 · 0 评论 -
剑指Offer——重建二叉树
重建二叉树题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。想法递归处理前序遍历的顺序是:根左右中序遍历的顺序是:左根右所以根一定是pre[0],所以我们可以把整个树拆成三部分来处理当前节点...原创 2020-02-12 14:38:56 · 93 阅读 · 0 评论 -
剑指Offer——二进制中1的个数
二进制中1的个数题目描述请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。想法直接按位与,时间复杂度O(logn)O(logn)O(logn)。利用n&(n−1)n\&(n-1)n&(n−1)将n最后一位1置0,时间复杂度O(m)O(m)O(m),m为1...原创 2020-04-05 08:50:01 · 117 阅读 · 0 评论