文章分类 - 剑指offer
摘要:题目 对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先) 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] "LeetCode" C++ 题解 根据
阅读全文
摘要:题目 对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。 给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] "LeetCode" C++ 题解 递归思想,
阅读全文
摘要:题目 给定一个数组 A[0,1,...,n−1A[0,1,...,n−1],请构建一个数组 B[0,1,...,n−1]B[0,1,...,n−1]。 其中 B 中的元素 B[i]=A[0] x A[1] x ... x A[i−1] x A[i+1] x ... x A[n−1]。不能使用除法。
阅读全文
摘要:题目 写一个函数,求两个正数之和,要求在函数体内不能使用四则运算符号。 "牛客网 OJ" C++ 题解 两个数异或:相当于每一位相加,而不考虑进位; 两个数相与,并左移一位:相当于求得进位; 将上述两步的结果相加 1. 两数进行异或: 0011^0101=0110 这个数字其实是把原数中不需进位的二
阅读全文
摘要:题目 求1+2+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键词及条件判断语句(?:)。 C++ 题解 这里使用了运算符&&的短路特性。 python 题解
阅读全文
摘要:题目 求买卖股票一次能获得的最大利润。例如,输入{9,11,8,5,7,12,16,14},5的时候买入,16的时候卖出,则能获得最大利润11。 "AcWing OJ" C 语言题解 遍历过程中记录最小值min,然后计算当前值与min的差值diff,并更新maxDiff。 C++ 题解 python
阅读全文
摘要:题目 0,1,2...n 1这n个数字拍成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字,求剩下的最后一个数字。 例如0,1,2,3,4这5个数字组成的圈,每次删除第3个数字,一次删除2,0,4,1,因此最后剩下的是3。 "AcWing OJ" C++ 题解 解法一 经典的解法, 用环形链表
阅读全文
摘要:题目 抽取5张牌,判断是不是一个顺子。2 10为数字本身,A为1,J为11,Q为12,K为13,大小王可堪称任意数字。 "" "" C++ 题解 把5张牌看成一个数组,就看排序后的数组是不是连续的,大小王看成特殊的数字,例如定义为0,与其他数字区分开,0的作用就是补充其他数字间不连续的空缺。 步骤:
阅读全文
摘要:问题 题目 把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值的出现概率。 思路 题解 测试
阅读全文
摘要:题目 定义一个队列并实现函数max得到队列里的最大值。要求max,pushBack,popFront的时间复杂度都是o(1)。 C++ 题解 同上一题相同,我们要寻找队列的最大值,相当于将滑动窗口设置为整个队列。 这里需要使用两个队列,一个队列用来保存入队的数据,一个队列用来保存队列的当前最大值。
阅读全文
摘要:题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口的最大值。例如,输入数组{2,3,4,2,6,2,5,1}和数字3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}。 "牛客网 OJ" "AcWing OJ" C++题解 借助 双向队列 ,对于新来的元素k,将其与队列中元
阅读全文
摘要:题目 输入一个整数s,打印所有和为s的连续正数序列(至少两个)。例如,输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出三个连续序列1~5,4~6,7~8。 "牛客网 OJ" "AcWing OJ" C++ 题解 这里也考虑两个数small和big分别表示序列的最小值和最大值。
阅读全文
摘要:题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使它们的和为s。如果有多对和为s,输入任意一对即可。 "牛客网 OJ" "AcWing OJ" C 语言题解 数列满足递增,设两个头尾两个指针i和j, 若ai + aj == sum,就是答案 若ai + aj sum,aj肯定不是答案之
阅读全文
摘要:题目 在一个数组中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。 "LeetCode" C++ 题解 如果题目中的“三次”换成“两次”,这道题目将非常简单,因此两个相同的数字异或,每一位都会变成0,其实亦或也可以看成两个数字的每一个二进制位对应进行加法后对2取模后的结果
阅读全文
摘要:题目 一个整数数组里除了两个数字出现一次,其他数字都出现两次。请找出这两个数字。要求时间复杂度为o(n),空间复杂度为o(1)。 "LeetCode" C++ 题解 两个相同的数字异或等于0。 如果数组中只有一个数字只出现一次,我们从头到尾异或每个数字,那么最终的结果刚好是那个只出现一次的数字。 而
阅读全文
摘要:题目 输入一课二叉树的根结点,判断该树是不是平衡二叉树。如果二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 "LeetCode" C++ 题解 采用递归的方法: python 题解
阅读全文
摘要:题目 找出二叉搜索树的第k大节点。例如,在下图的树里,第3大节点的值为4,输入该树的根节点,3,则输出4。 "Leetcode" C++ 题解 方法一 查找左子树的数量: 方法二 利用栈实现: python 题解 中序遍历将节点存放在列表中: Definition for a binary tree
阅读全文
摘要:题目 假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{ 3, 1,1,3,5}中,数字3和它的下标相等。 "AcWing OJ" C 语言题解 由于数组是单调递增排序的,因此我们可以尝试二分查找算法来进行优化。假设我们
阅读全文
摘要:题目 一个长度为n 1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n 1之内。在范围0到n 1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 "AcWing OJ" C语言题解 若数组没有缺失,则每个数字和它的下标都相等。然而,现在数组有缺失,说明从缺失的那个数开始,后
阅读全文
摘要:题目 统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。 "牛客网 OJ" "AcWing OJ" C 语言题解 二分查找,找到第一次出现的位置以及最后出现的位置: int GetFirstK(const int
阅读全文