
剑指Offer
小胡同的诗
千里之行,始于足下
展开
-
台阶问题(动态规划)
链接:变态跳台阶题目详情:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:状态:dp[n]:表示n级台阶跳法转移方程:dp[n] = dp[n-1]+dp[n-2]+…+dp[1]+1这里有两种推法:1,由于dp[n-1]=dp[n-2]+…+dp[1]+1所以dp[n] = dp[n-1] + dp[n-1...原创 2019-07-29 14:52:27 · 748 阅读 · 0 评论 -
剑指offer--剪绳子(贪心 | DP)
解题思路:有动态规划和贪心两种方法。贪心通过打表我们发现这样的规律:一个数拆分达到最大一定是其拆乘3的个数达到最大,但如果结尾剩下1的话要少拆1个3从而拼成1个4。动态规划dp[i]:表示将长度为i的线段裁剪为m段的乘积最大值 (2 <= m <= n)转移方程:dp[i] = dp[j] * dp[i-j] (1 <= j <= i/2)class So...原创 2019-03-09 22:39:52 · 383 阅读 · 0 评论 -
数组中只出现一次的数字(异或)
链接:数组中只出现一次的数字题目详情:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。分析:X对应1的位两个数一定相反,于是找一个1的数将该异或值拆为两组:0、1,显然该位对应为1的异或到一块一定是其中一个出现1次的数,因为如果出现两次,那么两个会同时异或到一块,相当于0,这样做是根据异或具有的交换律和结合律得到的。这道题是数组中只出...原创 2019-07-28 10:32:29 · 248 阅读 · 2 评论 -
滑动窗口问题(单调队列)
链接:滑动窗口题目详情:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[...原创 2019-08-01 11:04:03 · 501 阅读 · 0 评论 -
剑指offer--栈的压入、弹出序列
模拟栈操作入栈前进行判断,空间复杂度大了O(n)class Solution {public: bool isPopOrder(vector<int> pushV,vector<int> popV) { if (pushV.size() != popV.size()) { return false; ...原创 2019-03-10 23:44:17 · 136 阅读 · 0 评论 -
线性时间找链表倒数第k个节点
题目描述09年统考的源题,虽然都能得到**O(n)**的复杂度,不过满分做法是双指针,也就是指针扫一遍,其余做法均10分。输入一个链表,输出该链表中倒数第k个结点。思路:比较直观的想法是辅助空间或者是借助栈、递归等方式实现,不过正解还是双指针,发现408很喜欢靠双指针的思想,用来优化线性复杂度。做法如下:指针1顺序扫到正数第k个节点,从这时候开始指针2跟着指针1往后扫,当指针1到达尾部时,...原创 2019-07-26 15:47:15 · 172 阅读 · 0 评论 -
镜像反转二叉树
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思...原创 2019-07-25 16:01:58 · 196 阅读 · 0 评论 -
线性复杂度查找链表的公共节点
题目详情:输入两个链表,找出它们的第一个公共结点。思路:1,由于从公共节点开始之后都是公共节点,也就是说不管两个链的长度是否一样,反过来的公共长度一定一样,于是用两个栈来从后往前匹配,找到最后一个公共节点即为原链的第一个公共节点。2,和思路一很类似,先让两个开始匹配的指针水平线相同,也就是长的那个要走到与短的那个链有相同长度的位置,之后就从前往后匹配。之所以这样子做是因为:假设k为公共长度...原创 2019-07-25 15:33:50 · 129 阅读 · 0 评论 -
和为S的连续序列(双指针、滑动窗口)
链接:和为S的连续序列题目详情:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!分析:很容易...原创 2019-08-02 16:31:18 · 143 阅读 · 2 评论 -
矩形覆盖(动态规划)
链接:矩形覆盖题目详情:我们可以用2∗12*12∗1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2∗12*12∗1的小矩形无重叠地覆盖一个2∗n2*n2∗n的大矩形,总共有多少种方法?分析:看这样一个图,假如第列的那排用竖的填充,标为1,那么显然剩下的n-1列的排列方案数量就是它这样排的方案数;如果第n列第一行用横的填充,那么下一行和前一列这四块格子中明显都要标记为0,于是这...原创 2019-07-30 00:03:52 · 1022 阅读 · 0 评论 -
统计一个数字中二进制位1的个数
题目详情:给一个二进制数,其中负数用补码表示,问其中二进制‘1’的个数。思路1:在计算机中,其实为了运算的方便,负数都是用二进制的补码表示,也就是说,我们对其进行位运算其内部加法器的实现都是先转化成补码(详见组成原理)。对于这题有以下几个思路:按位统计,也就是每次从二进制最右边通过与1来查看该二进制位是否为1,然后通过循环判断。但注意这个方法对于负数要做特判,否则会陷入死循环!根据补码的特...原创 2019-07-18 07:38:06 · 271 阅读 · 0 评论 -
有序矩阵查询某值是否在阵中(搜索)
题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:由于是有序的,我们找个起点开始搜索,注意这个起点一定要能确定一个方向是递减一个是递增的,不然两个决策一样地话就不能搜索了,于是找了右上角作为起点dfs,复杂度O(max(row,col))O...原创 2019-07-17 14:20:09 · 426 阅读 · 0 评论 -
二叉树的S型遍历(双栈)
思路:维护两个栈,逻辑如下:奇数层的遍历明显从右到左,其下一层反向所以这层入栈的子树也应该从右到左偶数层反向注意在维护STL的时候指针参数地传递,关于对象的赋值要处理好,可以用指针减少不必要的麻烦!在处理遍历方向时候通过根节点加入不同的栈能够完成顺序地完全对称遍历,也就是本来是之字形遍历变为S型遍历Code:/*struct TreeNode { int val; ...原创 2019-07-17 07:29:23 · 2671 阅读 · 0 评论 -
给定二叉树的含中序的任意两个遍历序列还原二叉树
思路:该二叉树能够还原的充分条件是这两个序列必含有一个中序遍历序列。因为通过中序遍历序列以及之外的任意一个序列能够退出左右子树的规模,然后递归地构建父亲节点。Code:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *rig...原创 2019-07-12 09:31:09 · 421 阅读 · 0 评论 -
查询区间中出现次数超过长度的一半的数字
思路:思路有很多,大致有这几种:强行在线统计每个数字的出现次数,由于不知道数字的规模,用键值树(hash_map、Tree_map)记录次数,复杂度O(nlogn)O(nlogn)O(nlogn);利用排序的,如果某个数超过数组长度的一半那么它必然在中间位置mid出现,于是排序完我们可以扫一遍统计该数字的出现次数,复杂度O(nlogn)O(nlogn)O(nlogn);类似于在线找区间最大...原创 2019-07-09 22:23:28 · 558 阅读 · 1 评论 -
利用栈的结构O(1)动态查询当前最小值(双栈)
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:利用两个栈来进行操作,一个存正常的栈数据,另一个辅助栈存放当前最小值。入栈时:如果当前没有最小值或者加入的数字小于等于当前的最小值则更新辅助栈,即push新数据,否则不操作,这里注意定义为小于等于就加入,而不是小于,因为比如出现两个相等最小,靠后那个数字被pop掉了此时最小还...原创 2019-07-20 07:36:39 · 385 阅读 · 1 评论 -
二叉搜索树后序遍历序列合法性判断
链接:二叉搜索树后序遍历序列合法性判断题目详情:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析:分治,根据value(left)<value(root)<value(right)value(left) < value(root) < ...原创 2019-07-28 18:05:09 · 419 阅读 · 0 评论