常见算法题
范二er
这个作者很懒,什么都没留下…
展开
-
剑指Offer---面试题3:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列.请完成一个函数,输入这样的一个二维数组,判断数组中是否含有该整数.分析:例如如下数组,查找7是否存在于该数组中. 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 常见思维:将二维数组当做一个矩形,然后从数组中选取一个数字,分3种情况来原创 2016-09-13 19:34:55 · 657 阅读 · 0 评论 -
剑指Offer---面试题27:二叉搜索树与双向链表
一.题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val原创 2017-01-05 14:02:44 · 276 阅读 · 0 评论 -
剑指Offer---面试题19:镜像二叉树
一.题目操作给定的二叉树,将其变换为源二叉树的镜像。 public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;public TreeNode(int val) { this.val = val;}}二.分析以题目中的两棵树为例: 就是先序遍历这棵树,如果当原创 2016-12-28 19:30:36 · 284 阅读 · 0 评论 -
剑指Offer---面试题21:包含min函数的栈
一.题目定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。import java.util.Stack;public class Solution { public void push(int node) { } public void pop() { } public int top() { } public int min() {原创 2016-12-28 19:31:38 · 273 阅读 · 0 评论 -
剑指Offer---面试题22:栈的push,pop序列问题
一.题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)二.分析首先精简一下题目的意思:就是输入两个数组,int[]A,int[]B,A为入栈顺序,判断原创 2016-12-28 19:33:35 · 514 阅读 · 0 评论 -
剑指Offer---面试题35:第一个只出现一次的字符
一.题目在一个字符串(1二.分析思路1: 从头到尾的扫描字符串,每扫描到一个字符,就和后面的字符进行比较,如果后面的字符串中没有出现相同的字符,那么该字符就是只出现一次的第一个字符,返回此时外层for循环的循环变量i,就是该字符的位置;时间复杂度:o(n)^2思路2: 1. 构造一个哈希表,Chatacteer作为key,Integer'作为value,分别表示字符原创 2017-01-10 15:13:54 · 312 阅读 · 0 评论 -
剑指Offer---面试题36:数组中的逆序对
一.题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。 例如:{7,5,6,4},一共存在五个逆序对:{7,5},{7,6},{7,4},{5,4},{6,4};二.分析思路1:显而易见,从头到尾扫描数组,没扫描到一个数字,就拿去和后面所有的数组进行比较,两个for循环,解决问题,算法时间复杂度为o(n^2),思路2:原创 2017-01-11 15:28:55 · 363 阅读 · 0 评论 -
剑指Offer---面试题37:两单链表中第一个公共节点
一 题目输入两个链表,找出它们的第一个公共结点。public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}二 思路假设单链表1表长n, 单链表2表长m;思路1:遍历单链表1(表长n),每遍历一个节点就循环遍历单链表2(表长m)原创 2017-02-16 12:15:58 · 379 阅读 · 0 评论 -
剑指Offer---面试题18:树的子结构
一.题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构);树的结点结构如下:public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val =原创 2016-12-21 16:02:06 · 506 阅读 · 0 评论 -
算法题:二叉树打印
1.题目有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode r原创 2017-03-13 14:37:08 · 553 阅读 · 0 评论 -
剑指Offer---面试题26:复杂链表的复制
一.题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)public class RandomListNode { int label; RandomListNode next = null; RandomLis原创 2017-01-05 12:06:36 · 250 阅读 · 0 评论 -
剑指Offer---面试题25:二叉树中和为某值的路径
一.题目入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二.分析首先要对路径这一次定义有准确的了解,如题目所述,从根节点往下,到叶子节点所经过的节点,当然也包括根节点和叶子节点;然后,由题目意思可以知道,要使 “二叉树中结点值的和为输入整数(int target) 的路径”,那么在先序遍历的时候,从根节点开原创 2017-01-05 11:32:28 · 254 阅读 · 0 评论 -
剑指Offer---面试题5:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印每个节点的值.分析1:通常,打印是一个只读操作,我们不希望打印的同时去修改原数据的内容.故我们不能改变链表的结构.解决这个问题肯定是需要遍历链表的,但是遍历的顺序是从头到尾的,可输出的顺序确实从尾到头,也就是说第一个遍历到的节点最后一个输出,最后一个遍历到的节点第一个输出. 这是典型的”先进后出“,我们可以利用栈来实现这种顺序;代码1:/* *链表的数原创 2016-09-17 21:35:24 · 710 阅读 · 0 评论 -
剑指Offer---面试题6:重建二叉树
题目:输入某二叉树的连续遍历和后序遍历结果,请重建此二叉树.输出它的头结点.(假设输入的前序遍历和后序遍历结果中都不含重复数字)分析:前序遍历的第一个数字总是树的根节点的值,假设这个值为A;在中序序列中A位于p位置处,A左边的节点,都是A的左子树的中序遍历,A右边的节点都是A的右子数的中序遍历;另一方面,前序序列中第二个位置到p位置,也是A左子树的前序遍历,剩余的就是A右子树的前序遍历;假设原创 2016-09-19 19:41:27 · 350 阅读 · 0 评论 -
剑指Offer---面试题:使用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路: 首先,应该明确栈和队列的特性.栈是先进后出表队列是先进先出表我们可以这样设想: 1. push操作,我们将元素压入stack1; 2. pop操作,我们将stack1里面的所有元素都出栈,然后依次压入stack2; 这样一来,原先第一个压入stack1里面的元素(假设是Integer类型的原创 2016-11-29 15:28:01 · 439 阅读 · 0 评论 -
剑指Offer---面试题8:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路1:如果此类题目出现在在线编程题中,那么想要通过系统的测试数据,无疑是非常简单的,不啰嗦,直接贴代码:cla原创 2016-12-08 17:11:45 · 273 阅读 · 0 评论 -
剑指Offer---面试题9:斐波那契数列
题目:写一个函数,输入n,求斐波那契数列的第n项;解法一:刚进大一的时候,学习c语言,斐波那契数列是经常用于展示递归的经典例子.但是从时间复杂度角度来说的话,采用尾递归这并不是一个优秀的算法.public void Fibonacci(int n){ if(n<=0){ return 0; } if(n==1){ return 1; }原创 2016-12-09 15:07:13 · 456 阅读 · 0 评论 -
剑指Offer---面试题15:链表中的倒数第k个节点
一.题目 输入一个链表,输出该链表中倒数第k个结点。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindKth原创 2016-12-17 11:08:38 · 392 阅读 · 0 评论 -
剑指Offer---面试题16:反转链表
一.题目 输入一个链表,反转链表后,输出链表的所有元素。public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}二.分析参考 剑指Offer—面试题15:链表中的倒数第k个节点一文中的分析,这道题目也就是面试题15所体现出原创 2016-12-17 14:31:33 · 475 阅读 · 0 评论 -
剑指Offer---面试题17:合并两个有序链表
一.题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。二.分析根据题目条件,就可以联想到归并排序(Merge_Sort)的算法,差异在于:经典的归并算法中,被排序的是数组,而,数组的容量在一开始就是被确定的,所以我们需要用o(N)的临时空间来辅助算法的进行.而这道题目的容器是链表,故不需要这o(N)的辅助空间;接下来的思路就和归并排序的merge方法原创 2016-12-17 16:19:07 · 690 阅读 · 0 评论 -
剑指Offer---面试题14:调整数组,使奇数位于偶数前
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。分析:最开始思路是这样的: 1. 整两个指针leftPos,rightPos,一个指向数组最前端,一个指向数组最后端; 2. leftPos向右移动,当array[leftPos]%2==0的时候停下来,与此同时righ原创 2016-12-14 15:59:07 · 506 阅读 · 0 评论 -
算法题:二叉树A是否包含二叉树B的拓扑结构
1. 题目对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;原创 2017-03-13 16:19:35 · 1173 阅读 · 0 评论