数据结构与算法
攻城晓狮子
这个作者很懒,什么都没留下…
展开
-
高频排序算法
1.冒泡排序冒泡排序是一种交换排序(相邻元素两两比较)。算法思想:冒泡排序重复地走访过要排序的数列,一次比较相邻的两个元素,如果它们的顺序不符合次序要求就交换它们的位置。走访数列的工作是重复地进行直到没有再需要交换的元素时,就说明该数列已经排序完成。假设一个数组中有N个元素,要求按照升序排序。(1)如果采用从后往前比较的方法,则最小值率先出现在数组的头角标位上。//假设数组一共有N个元素,要求按照升序排序 //冒泡排序1(如果是从后往前比较,则最小值率先出现在数组的头角标位上) public原创 2020-08-12 18:05:30 · 320 阅读 · 0 评论 -
《剑指Offer》(59)队列的最大值以及双端队列接口Deque
1.双端队列Java中实际上提供了java.util.Stack类(该类继承自Vector类)来实现栈结构(后入先出LIFO),但官方目前已不推荐使用(因为Vector虽然与ArrayList的底层同是基于数组结构,但是Vector是线程安全的,而ArrayList不是线程安全的),而是使用java.util.Deque双端队列来实现队列(先入先出FIFO)与栈(后入先出LIFO)的各种需求。j...原创 2020-04-14 21:36:58 · 409 阅读 · 0 评论 -
《剑指Offer》(43)1~n整数中1出现的次数
题目:输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。例如:输入12,1~12这些整数中包含1的数字有1、10、11和12,1一共出现了5次。设N = abcde ,其中abcde分别为十进制中各位上的数字。如果要计算百位上1出现的次数,它要受到3个方面的影响:百位上的数字(c),百位以下(低位)的数字(de),百位以上(高位)的数字(ab)。① 如果百位上数字为0,百位上可...原创 2020-03-24 17:45:24 · 155 阅读 · 0 评论 -
《剑指Offer》(41)数流中的中位数及Java的优先队列PriorityQueue
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。Java中的优先队列PriorityQueuePriorityQueue基于优先级堆,它实现了Queue接口,可以对集合中的元素进行排序,在JDK1.5中引入。该集合内可以存放基本数据类型对象包装类(如...原创 2020-03-23 16:36:29 · 242 阅读 · 0 评论 -
Java实现堆排序
堆排序及图解对于一个长度为n的数组R(n)={r[0],r[1],…,r[n-1]}。大顶堆(最大堆):r(i)>=r(2i+1)且r(i)>=r(2i+2),堆顶元素必为最大值,用于升序;小顶堆(最小堆):r(i)<=r(2i+1)且r(i)<=r(2i+2),堆顶元素必为最小值,用于降序。堆排序主要包括两个过程:(1)构建堆(从最后一个非叶子节点开始,即序号为n...原创 2020-03-22 17:57:00 · 144 阅读 · 0 评论 -
《剑指Offer》(33)二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果,如果是则返回true,否则返回false。假设输入的数组的任意2个数字互不相同。二叉搜索树(二叉排序树,二叉查找树)的特点:(1)如果左子树不空,那么左子树上所有结点的值都小于它的根结点的值;(2)如果右子树不空,那么右子树上所有结点的值都大于它的根结点的值;(3)左、右子树也分别是二叉搜索树。在后序遍历(左子树->...原创 2020-03-12 19:12:16 · 85 阅读 · 0 评论 -
《剑指Offer》(32)之字形打印二叉树
题目:请实现一个函数按照之字形顺序打印二叉树,即第一层按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三层再按照从左到右的顺序打印,其他行以此类推。使用两个栈(后入先出)来实现。import java.util.ArrayList;import java.util.*;/*public class TreeNode//节点类{ int val = 0;//根节点的值 ...原创 2020-03-12 17:02:30 · 74 阅读 · 0 评论 -
《剑指Offer》(32)分行从上到下打印二叉树
题目:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。从上到下按层打印二叉树,其实就是二叉树的层序遍历,也可以说是广度优先遍历(DFS)二叉树。当遇到广度优先遍历一个有向图或者一棵二叉树时,首先要想到的就是队列(先入先出)这种数据结构。首先遍历二叉树的树根,并将根结点添加到队列尾部,然后从队列头部取出一个节点打印出来,并将其左、右子结点依次添加到队列尾部。接下来,每次...原创 2020-03-07 19:36:53 · 127 阅读 · 0 评论 -
《剑指Offer》(31)栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序,假设压入栈的所有数字不相等,且压入序列和弹出序列的长度相等。通过ArrayList类来模拟堆栈工作原理,其中ArrayList类的常用方法如下:返回值类型方法booleanadd(E e):将指定元素添加到集合的尾部Eremove(int index ):移除此集合中指定位置...原创 2020-03-04 20:13:06 · 108 阅读 · 0 评论 -
《剑指Offer》(27)二叉树的镜像
题目:请完成一个函数,输入一棵二叉树,该函数输出它的镜像。通过画图,我们可以很容易地发现,求解一棵二叉树的镜像,其实就是前序遍历(树根->左子树->右子树)其所有的非叶子结点,若遍历到的结点的左右子树均不为空,则交换其左右子树的位置。对二叉树这种数据结构熟悉的读者,自然知道可以用递归的方法去遍历,也可以用循环的方法去遍历。1.通过递归的方法/**public class Tr...原创 2020-03-02 18:38:07 · 152 阅读 · 0 评论 -
《剑指Offer》(26)树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构(约定空树不是任何一棵树的子结构)。要查找树A中是否存在和树B结构一样的子树,可以分为2步来考虑:第一步,对树A进行层序遍历,在树A中找到和树B中的根结点的值相等的结点N;第二步,如果在树A中找到了和树B中的根结点的值相等的结点N,则继续判断树A中以结点N为根结点的子树是否包含和树B一样的结构,即判断树A中以结点N为根节点的左子结点的值和右子结点...原创 2020-03-01 17:47:28 · 95 阅读 · 0 评论 -
《剑指Offer》(24)反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点考虑到如果将链表中某一个结点i的next指针指向它的前一个结点h,那么就会导致链表断裂,无法在链表中遍历到该结点的后一个结点j,因此我们需要定义一个指针提前记录下结点i的后一个结点j。这样,我们总共需要定义3个指针,分别指向当前结点i、当前结点的前一个结点h和当前结点的后一个结点j。同时,何为反转后链表的头结点呢?当然...原创 2020-02-29 19:47:19 · 82 阅读 · 0 评论 -
《剑指Offer》(23)链表中环的入口节点
#题目:如果一个链表中包含环,如何找出环的入口节点?链表问题是面试过程中经常会考察到的问题,这个问题其实内含2个小问题:1.如何判断一个链表中是否包含环;2.找出带环链表中环的入口点。当我们用1个指针遍历链表不能解决问题的时候,可以尝试用2个指针来遍历链表。可以让其中一个指针遍历的速度稍快一些(比如:让其中一个指针一次走2步,另一个指针一次走1步),也可以让其中一个指针在链表上先走若干步。...原创 2020-02-29 18:17:24 · 125 阅读 · 0 评论