![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
皓皓儿
走在程序猿道路上
展开
-
合并两个排序列表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。这个题,如果我们按照一般的思路去思考,不用递归的话,就是从两个链表的开头往后比较,数值小的放到新的链表中,然后又从链表的开头进行比较。 这样知道其中某一个链表的所有元素被遍历完,另一个没有被遍历完的链表的剩余部分一定是有序的,并且比新的链表的中的节点的值大,所以直接接在新的链表的后面即可。综上分析,代码如下原创 2017-04-28 11:24:47 · 3495 阅读 · 0 评论 -
矩形覆盖--递归实现
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?这个题的比较难以下手,首先找一下规律,n=1,只有一种,n=2,是一个正方形,可以讲小矩形横着放或者竖着放: 当n=3,假如第三个小矩形恰好能够竖直放下,这个时候,就相当于只考虑第一个和第二个小矩形怎么放,也就是怎么用小矩形去填充一个正方形,就回到了上一步,n=2时的方法原创 2017-04-25 14:53:14 · 838 阅读 · 0 评论 -
二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。首先要理解这个题考点不是要你怎么去表示原码、补码、反码之类的。在计算机中正数的表示就是他的原码,负数的表示就是他的补码。至于这几个码到底是怎么样的,后面再讲。举例子,6的二进制表示为0000 0110(一般都是用8位表示原码)。6-1,二进制的表示为:0000 0110 - 0000 0001,这个时候,遇到0000 0110从右到左,原创 2017-04-25 15:44:23 · 700 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。首先要搞清楚二叉搜索树,二叉搜索树不同于一般的二叉树,它是有顺序的,总的来说是 左子树<根节点<右子树。如下图: 而后序遍历的顺序是:左子树、右子树、根节点。上图二叉搜索树的后续遍历结果是:{2,9,5,16,17,15,19,18,12}可以发现,根节点总是原创 2017-05-08 09:21:12 · 2410 阅读 · 0 评论 -
数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。这道题是感觉比较难的一道题。 用库函数很简单,但是不在考虑范围之内。 首先分析 (1)当指数(exponent)<0,要考虑底数(base)是不是为0,例如0^-5=1/0^5,会出错。 (2)当指数(exponent)=0,最红的值为1; (3)当指数(exponent)>0,就原创 2017-04-25 21:56:46 · 265 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。这个题,有两种考虑方法,一种是空间换时间,一种是时间换空间。方法一: 空间换时间。思路是,遍历原数组,遇到是奇数的就加入到新的数组中,并且要设置一个标志位一直指向新数组中待插入的那一位。然后,再次遍历数组,遇到偶数就原创 2017-04-26 12:40:31 · 248 阅读 · 0 评论 -
二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。路劲指的是从根节点开始到叶子节点的一个通路,所以首先必须访问根节点,在几种遍历树的方法中,前序遍历的顺序是根->左->右。所以,我们采用前序遍历,首先访问根节点,然后访问根节点的左孩子。这个时候,我们的当前节点就是左孩子,最开始的根节点就无法访问,所以需要用一个原创 2017-05-09 09:57:37 · 379 阅读 · 0 评论 -
链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。链表采用非连续地址存储,所以节点中都会存储下一个节点的信息,有的链表还会同时存储上一个节点和下一个节点的信息。因此链表相比于数组来说,输出指定位置的元素并不那么容易。需要进行遍历操作,这是无法逃脱的。这个题,我们首先要考虑: (1)链表为空时,直接返回null; (2)k的值<1的时候,也不正确; (3)k的值超过链表长度也不正确。这时候,很简单的一种原创 2017-04-27 13:58:55 · 352 阅读 · 0 评论 -
复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)这个题的思路1: 从头遍历遍历原链表,第一次遍历只存储链表的前后关系,不存储他的random节点关系。 第二次再遍历,存储他的random节点,这样的时间复杂度是n平方。思路二:每遍历原创 2017-05-10 12:52:00 · 332 阅读 · 0 评论 -
反转链表
输入一个链表,反转链表后,输出链表的所有元素。首先这个题要看清楚,是反转链表再进行输出,而不是将链表反向输出。所以第一件要做的就是将链表反转。假如首先我们只考虑两个节点的反转,只需要将head.next指向之前的节点就行了。但是假如有三个节点,加入第二个是当前的head的节点,我们将head.next指向之前的节点,前两个节点的顺序交换了,但是第三个节点和第二个节点就断了。所以,还要一个节点记录he原创 2017-04-27 21:23:22 · 411 阅读 · 0 评论 -
从链表翻转的递归算法到递归与栈的关系
早上起来做一个算法题,题目是从尾到头输出链表。 先遍历的后输出,与栈的先进后出特性一样,所以考虑用压栈出栈来解决。 先用非递归算法,比较简单,代码如下;public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { // 方法一:非递归,利用栈先进后出的特性 ArrayList <Integer>res原创 2017-04-19 09:45:58 · 492 阅读 · 0 评论 -
变态青蛙跳问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:最后一个台阶是必须上的,而之前的每一个台阶都有两种选择,上或者不上,那么前n-1个台阶就有2的n-1次方中选择,这就是最终的答案,Java中实现2的n-1次方,要用到库函数math.pow(2,n)。加入不允许用库函数,就要用位移运算,而位移运算的效率还要更高。“<<” 左移:右边空出原创 2017-04-24 22:33:08 · 381 阅读 · 0 评论 -
青蛙跳台阶--尾递归优化
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 才开始感觉有点懵,就看一下规律,当台阶只有一级台阶,f(1)=1,当台阶有2级,f(2)=2,当台阶有3级,f(3) = 3,f(4) = 5,依次类推,发现是个斐波拉切数列。那么,为什么会是这样呢? 假设要跳到6,有两种,一种是从5跳到5,这个时候,跳到6的方式就是f(5),另一种是从4跳到6,方法数就原创 2017-04-24 13:19:15 · 655 阅读 · 0 评论 -
树的子结构—递归、Java
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)主要思路: (1)在tree1中寻找tree2的根节点,如果找到了,就接着往下匹配左右节点,如果没有找到,就直接返回false,表示匹配失败; (2)加入tree1的某个节点和tree2的根节点相等,但是左右子树并不相同,并不能说明tree2就不是tree1的子结构,应该继续往下寻找; 如上图所示,根节点原创 2017-05-02 09:24:33 · 694 阅读 · 0 评论 -
二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \原创 2017-05-02 14:05:56 · 345 阅读 · 0 评论 -
根据二叉树的前序遍历和中序遍历,重构二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。前序遍历的顺序是“根->左->右”,中序遍历的顺序是“左->根->右”。因此,前序遍历的第一个数就是二叉树的根节点,在中序遍历中,找到根节点,根节点的左边是二叉树的左原创 2017-04-20 11:04:51 · 547 阅读 · 0 评论 -
用两个栈实现队列
栈的特点是“先进后出”,队列的特点是“先进先出”。 再插入的时候,先将第一个元素压入栈的栈底,后面的元素依次压入栈顶,最后一个压入的元素在栈顶。 而出栈的时候,必须从栈顶开始出栈,也就是最先入栈的元素最后出栈。这时,我们将所有元素{1,2,3,4,5}压入栈1,从栈底到栈顶,依次是{1,2,3,4,5}。栈1的出栈顺序是{5,4,3,2,1}。每次,在栈1出栈一个元素后,就将元素压栈到栈2,这时原创 2017-04-21 10:23:05 · 279 阅读 · 0 评论 -
顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.这个题感觉更像是找规律,我的思想是先求出从外到内一共有多少圈,然后去输入每一圈的四条边。 求圈数,要根据矩阵短边的长度来确定,也就是如果矩阵原创 2017-05-03 16:00:21 · 473 阅读 · 0 评论 -
包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。栈的特点是先进后出,所以要求min的时间复杂度是1,就必须将最小的元素时刻放在栈顶,那么我们考虑每次压栈的时候,将当前要压栈的元素和栈中所有元素进行比较,最小的放在栈顶。这样是可以满足min函数的要求,但是这个数据结构就不是栈了,因为不能保证先进后出。那么我们考虑在栈中设置一个变量保存最小的元素,但是,加入我们将最小的元素出栈,那原创 2017-05-03 19:45:12 · 311 阅读 · 0 评论 -
栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)设定辅助栈,如果当前弹出的数字刚好是栈顶数字,就直接弹出,如果不是栈顶数字,就继续压栈,如果找到了相等的原创 2017-05-04 09:36:21 · 255 阅读 · 0 评论 -
从上往下打印二叉树
从上往下打印出二叉树的每个节点,同层节点从左至右打印。这其实就是二叉树的层次遍历: (1)访问根节点 (2)在访问第i层的时候,将i+1层的节点按顺序保存在队列中; (3)进入下一层并访问该层的所有节点; (4)重复以上操作,知道遍历完所有节点。这里要注意,Java中的队列: LinkedList实现了Queue接 口。所以用LinkedList。 主要方法:add 增加一原创 2017-05-04 11:27:47 · 249 阅读 · 0 评论 -
旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析这个题目,其实不用看什么数组的旋转的描述,感觉上没有多少意义,实际要做的就是对这个数组{3,4,5,1,2}进行操原创 2017-04-23 21:28:38 · 270 阅读 · 0 评论 -
输出斐波那契数列的第n项
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39斐波拉切数列简单的说就是0,1,1,2,3,5,8……,简单的说就是后一项是前两项的和,很容易想到使用递归。既简单又方便,几行代码就搞定了。于是有了如下的代码:public class Solution { public int Fibonacci(int n) { if(n>39)原创 2017-04-24 10:18:40 · 4844 阅读 · 0 评论 -
二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。要搞明白二叉搜索树的概念,二叉搜索树(BST),主要用来实现搜索,它的左子树元素小于根节点的元素,右节点的元素大于根节点的元素。普通二叉树的搜索时间复杂度为O(n),二叉搜索树的平均搜索时间复杂度变为O(logn)。搜索二叉树举例:按照题目要求,最终的结果应该为: 可以看到这个顺序和二原创 2017-06-22 08:48:20 · 427 阅读 · 0 评论