剑指offer
willinux
github地址:https://github.com/stephenix
展开
-
98. Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST).Assume a BST is defined as follows:The left subtree of a node contains only nodes with keys less than the node’s key.The right subtree of a node contains only nodes with keys great原创 2020-06-08 17:10:27 · 98 阅读 · 0 评论 -
面试题25-II:判断是否是二叉搜索树
面试题25-II:判断是否是二叉搜索树Description:输入一个整形数组,表示一颗满二叉树,判断是否是一颗二叉搜索树。满二叉树:一颗二叉树,除了最后一层没有子节点,其他节点都有两个子节点。二叉搜索树:一颗二叉树,若左子树不空,则左子树的所有节点值都小于它的根节点值;若右子树不空,则右子树的所有节点值都大于它的根节点值,且它的左右子树分别是二叉搜索树。题目链接:牛客网链接Analy...原创 2020-03-02 19:59:59 · 261 阅读 · 0 评论 -
面试题31:连续子数组的最大和
面试题31:连续子数组的最大和题目描述:class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { int maxi, size, cur, i; size = array.size(); if (size == 0) retur原创 2015-09-13 14:54:32 · 460 阅读 · 0 评论 -
面试题18x:二叉树的镜像
题目描述将给定的二叉树,将其变换为源二叉树的镜像。题目分析二叉树问题,常用解决方法是递归,因为递归思路清晰,容易理解。 从本质上讲,二叉树问题都是二叉树遍历的问题。 比如该题目,本质是二叉树先序遍历。思路:求一颗树的镜像过程,根据先序顺序遍历,如果遍历到的结点有子结点,就交换它的两个子结点。依次遍历,直到所有的非叶子结点的子树都交换完,就得到源二叉树的镜像。class So...原创 2018-04-30 10:16:38 · 143 阅读 · 0 评论 -
面试题14:调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题目分析:1.最直接的想法,申请一个数组保存所有的偶数,再把源数组中奇数移动到前面,再将保存的偶数赋到数组的后半部分; 2.如果要求不能申请空间,应该怎么做?关键是保证相对位置不变,用两个一前一后的指针,...原创 2018-04-25 22:48:53 · 122 阅读 · 0 评论 -
面试题33:把数组排成最小的数字
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。题目分析 定义一种新的比较规则class Solution {public: string PrintMinNumber(vector<int> numbers) { ...原创 2018-05-10 15:20:17 · 313 阅读 · 0 评论 -
面试题23:从上往下打印二叉树
题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印。题目分析: 二叉树层次遍历,需要辅助队列。class Solution {public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int> ret; queue<TreeNo...原创 2018-05-03 20:19:24 · 246 阅读 · 0 评论 -
矩形覆盖
题目描述用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?题目分析思想武装头脑,果然。1.分治思想采用分治思想,第一步,如果选择竖方向填充,则问题规模变为(n - 1),如果选择横方向填充,则问题规模变为(n - 2),直至问题规模减小到可以直接求解,合并结果,这就是分治思想。 class ...原创 2018-04-26 16:25:20 · 137 阅读 · 0 评论 -
面试题24:二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。题目分析 又是二叉树遍历问题。 1.什么是二叉搜索树? 又名二叉排序树,若左子树非空,则左子树结点的值都小于根结点,若右子树非空,则右子树结点的值都大于根结点。2.后序遍历是什么?有什么特点? 后序遍历:左右根 特点:后序遍历的最后...原创 2018-05-06 10:18:47 · 188 阅读 · 0 评论 -
面试题35:第一个只出现一次的字符
题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置题目分析 用哈希表存储字符串中每个字符出现的次数。第一次遍历获取每个字符的出现次数,第二次遍历找到一个出现一次的字符并返回它的位置,时间复杂度o(n)。代码: stl中map默认是按照key从小到大排序class Solution {public: ...原创 2018-05-13 17:33:59 · 180 阅读 · 0 评论 -
面试题37:两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点。题目分析 链表是单链表,所以两个链表的第一个公共结点后的结点都是公共结点。 思路:可以从尾结点逆序遍历,最后一个相同的结点就是第一个公共结点。听起来有些像“后进先出”,就是栈的出栈顺序,于是就有了方法1,两个辅助栈,栈中保存链表中的结点,然后从栈顶开始比较结点直到最后一个相同的结点。方法1是空间换取时间,降低时间复杂度。 还可以...原创 2018-05-13 18:06:57 · 161 阅读 · 0 评论 -
面试题42:左旋转字符串(未)
题目描述 对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。题目分析暴力解法:一次移动一位class Solution {public: string LeftRotateString(string str, int n) { if (n == 0...原创 2018-05-13 21:06:43 · 151 阅读 · 0 评论 -
面试题9:斐波那契数列
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目分析 f0 = 1; f1 = f0; f2 = f1 + f0 = 2*f1; f3 = f2 + f1 + f0 = 2*f2; … fn = fn-1+fn-2+…+f1+f0 = 2*fn-1; 思路1:从fn = 2*fn-1自然想到递归。 思...原创 2018-06-11 13:23:04 · 199 阅读 · 0 评论 -
面试题19:二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。题目分析 二叉树先序遍历+递归 如果根结点是空或者左右子树结点都是空,则返回,否则,先交换自右子树结点,再递归求左右子树的镜像。class Solution {public: void Mirror(TreeNode *pRoot) { if (pRoot == NULL || (pRoot->...原创 2018-05-23 22:16:22 · 127 阅读 · 0 评论 -
面试题8:旋转数组的最小值
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题目分析 方法论: 旋转数组,也是有序数组,先想到二分查找。 查找类问题,就是缩小比较范围,减少比较...原创 2018-06-10 22:25:25 · 211 阅读 · 0 评论 -
面试题6:重建二叉树
面试题6:重建二叉树题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题目分析: 给出一棵树的前序遍历和中序遍历序列,可以唯一确定一颗二叉树。如何重建一颗二叉树,思路容易想到,先确定根结点,...原创 2015-10-02 12:15:23 · 559 阅读 · 0 评论 -
面试题22:栈的压入、弹出序列
面试题22:栈的压入、弹出序列题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。题目分析: 给一个入栈序列,一个出栈序列,判断出栈序列是否是入栈可能的出栈序列。 直接的方原创 2015-10-02 15:43:07 · 515 阅读 · 0 评论 -
面试题32:从1到n整数中1出现的次数
面试题32:从1到n整数中1出现的次数题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。题目分析: 直接的解法是,1~n的每一个整数都数一下1的个数,相加原创 2015-10-11 22:38:55 · 481 阅读 · 0 评论 -
顺式队列的实现和链式队列的实现
顺式队列的实现和链式队列的实现 顺式队列,用数组保存队列中的各个元素的值,front和rear分别指向队列中的第一个和最后一个元素。代码如下:#include #include #define max_size 50typedef struct Queue { int arr[max_size]; int front;原创 2015-05-29 08:52:38 · 922 阅读 · 0 评论 -
面试题11:数值的整数次方
面试题11:数值的整数次方实现函数 double Power(double base, int exponent),即乘方运算。同时,对应leetcode上第50题。题目分析: 看起来,很简单,res *base就可以做到。再进一步考虑问题全面一些是,exponent正数、负数,base是否会是0,如何判断double类型的base是否是0。 题目容原创 2015-06-01 14:26:02 · 585 阅读 · 0 评论 -
面试题18:树的子结构
面试题18:树的子结构题目描述 输入两颗二叉树A,B,判断B是不是A的子结构。 题目分析: 显然是二叉树的遍历,递归的代码比较简洁,面试如果没有特别要求,尽量用递归。 注意指针是否为空的判断,先比较子树A和子树B的根结点是否相同,如果相同,则进步一步比较子树AB的左右子节点是否相同;如果根结点不同,则先判断子树B是否在子树A的左子树中,如果不在子树A的左子树,则再判断子树B是否在子树A...原创 2015-09-12 17:09:01 · 405 阅读 · 0 评论 -
面试题24:二叉搜索树的后序遍历序列
面试题24:二叉搜索树的后序遍历序列题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。题目分析: 二叉搜索树的后序遍历有什么特点:最后一个值是根结点,左子树上的结点值都小于根结点的值,右子树上的结点值都大于根结点的值(题目已知任意两个数字都不相同)。 了解了这些,思路就有了,分别递归判断左右子树原创 2015-10-02 16:39:54 · 427 阅读 · 0 评论 -
面试题25:二叉树中和为某一值的路径
面试题25:二叉树中和为某一值的路径题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。题目分析: 路径指从根结点到叶子结点的一条路。 解决方法,还是递归实现二叉树遍历。 只有先序遍历是先访问根结点,所以这里选用先序遍历。当有多条路径或者当前路径不满足条件,则需要将当前结点从路径删除...原创 2015-10-03 11:38:41 · 518 阅读 · 0 评论 -
面试题27:二叉搜索树与双向链表
面试题27:二叉搜索树与双向链表题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。题目分析: 给定一颗二叉搜索树,二叉搜索树有left、right指针分别指向左孩子、右孩子,求返回二叉搜索树转换成的排序好的双向链表的头指针。排好序的双向链表,可以想到中序遍历二叉搜索树就是排好序的。指向左子树结点的指针修改成...原创 2015-10-05 11:13:21 · 492 阅读 · 0 评论 -
面试题26:复杂链表的复制
面试题26:复杂链表的复制题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。题目分析:本质上该题目考察的是将复杂问题分解成简单问题的能力。复杂链表,顾名思义,相对于普通链表会复杂一些。复制链表,首先考虑如果是普通链表如很容易复制,复杂链表复制在于链表结点中有一个特殊指针可指向任意一个结点,复制特殊指针时需要遍历当...原创 2015-10-04 16:26:24 · 640 阅读 · 0 评论 -
面试题29:数组中出现次数超过一半的数字
面试题29:数组中出现次数超过一半的数字题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。题目分析: 找出在数组中出现次数超过一半的数。直观的解法是,数组排序,排序后数一下得出出现次数超过一半的数,时间复杂度是O(NlogN),有没有更好的解法。原创 2015-10-07 17:26:54 · 420 阅读 · 0 评论 -
面试题28:字符串的排列
面试题28:字符串的排列题目描述: 输入一个字符串,返回该字符串中字符的全排列。 题目分析: 再来看这道题时,分外“眼红”,当年此题竟然没有做出来。 这道题,可以说用分治的思想,将字符串分成两个子问题,子问题1太小不需要再求解,只需要求解子问题2。当然,也可以理解为递归,《算法导论》讲动态规划章节时,有以这种朴素递归为入口来叙述。1. 递归解法思路分析1: 递归,将字符串分为两部分,第一个原创 2015-10-07 10:39:17 · 631 阅读 · 0 评论 -
面试题20:顺时针打印矩阵
面试题20:顺时针打印矩阵题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.class Solution {public: vector<int&g...原创 2015-09-21 22:16:50 · 469 阅读 · 0 评论 -
面试题30:最小的k个数(未)
面试题30:最小的k个数题目描述: 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。题目分析: 找出最小的k个数,直观的解法从小到大排序,取前k个即可,时间复杂度是O(NlogN),显然方法不够好。1. 时间复杂度O(N)的解法思路1: 前面已经可以得出,采用基于快速排序Partition过程有时间复杂度O(N)的解法,原创 2015-10-08 20:43:48 · 624 阅读 · 0 评论 -
面试题37:两个链表的第一个公共结点
面试题37:两个链表的第一个公共结点题目描述: 输入两个链表,找出它们的第一个公共结点。思路分析: 题目比较简单了,遍历两次,第一次遍历分别得出链表A和链表B的长度,长度长的链表先移动lenA - lenB步,开始比较两个链表的结点,同时移动。 代码如下:class Solution {public: ListNode* FindFirstCommonNode( ListNode *原创 2015-10-11 17:10:50 · 418 阅读 · 0 评论 -
C实现顺序栈和链式栈
C实现顺序栈和链式栈看到《剑指offer》面试题7,用两个栈实现队列这道题,所以就分别把栈和队列都实现了一下,栈和队列都有两种存储方式,一种是顺序存储,另外一种是链式存储。 栈,有栈顶指针指向当前栈最顶的元素。顺序栈,则栈中的元素用数组保存即可;链式栈,关键是如何通过链表把栈中的元素串起来,栈顶指针top指向当前栈中的栈顶元素,有新的元素入栈时,新的元素的next指向栈原创 2015-05-28 16:21:49 · 2119 阅读 · 0 评论