数据结构与算法
文章平均质量分 62
qq_43193797
github:https://github.com/yanjie666
展开
-
详解KMP算法
原创地址:https://www.cnblogs.com/dusf/p/kmp.html转载:https://www.cnblogs.com/dusf/p/kmp.html转载 2019-10-25 11:05:43 · 123 阅读 · 0 评论 -
在二叉树中找到一个节点的后继节点
【题目】 现在有一种新的二叉树节点类型如下:public class Node { public int value; public Node left; public Node right; public Node parent; public Node(int data)...原创 2019-02-11 23:00:21 · 308 阅读 · 0 评论 -
摒除一切封建迷信之递归并不难------排序2
剖析递归行为和递归行为时间复杂度的估算一个递归行为的例子master公式的使用 T(N) = a*T(N/b) + O(N^d) 1) log(b,a) > d -> 复杂度为O(N^log(b,a))2) log(b,a) = d -> 复杂度为O(N^d * logN)3) log(b,a) < d -> 复杂度为O(N^d)补充阅读:...原创 2019-01-29 22:20:08 · 180 阅读 · 0 评论 -
逆序思路
原创 2019-01-29 23:39:54 · 164 阅读 · 0 评论 -
算法之斐波那契数列如何求第n个值与前n项和?(Java)
斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)。1.题目1.1.求斐波那契数列的第n项的值2.2.求斐波那契数列前n项的和2.例子2.1.求第n项的值输入:6输出:82.2.求前n项的和...原创 2019-02-20 18:34:59 · 4749 阅读 · 0 评论 -
使用Java语言和递归算法算出1加到100
public class Recursion { public static void main(String[] args) { //调用自定义的方法 System.out.println("1+2+3+...+100="+recursion(100)); } //自定义函数方法 public static in...原创 2019-03-02 00:09:59 · 1449 阅读 · 0 评论 -
Java 采用递归方式实现求数组最大值
public class Test { public static void main(String[] args) { int numbers[] = new int[]{1, 5, 7777,9,20,122}; System.out.println(getMaxNumber(numbers)); } private static in...原创 2019-03-02 00:16:13 · 621 阅读 · 0 评论 -
Java字符串反转调动递归式
public static String reverse(String originStr) {if(originStr == null || originStr.length() <= 1)return originStr;return reverse(originStr.substring(1)) + originStr.c...原创 2019-03-02 00:52:20 · 490 阅读 · 0 评论 -
java中递归的应用,题目:f(20)=1,f(21)=4,f(n+2)=2*f(n+1)+f(n); 其中,n是大于零的整数,求f(10)的值。
public class Test { public static int f(int n){ if(n==20){ return 1; }else if(n==21){ return 4; }else if(n<20){ return f(n+2)...原创 2019-02-20 20:53:52 · 3855 阅读 · 4 评论 -
有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第十天时,想再吃时(还没吃),发现只有1个桃子了。问题:最初共多少个桃子?
public int getCount(int day){ if(day==10){ return 1; }else{ return getCount( (day+1) + 1 ) * 2; }}...原创 2019-02-20 21:11:06 · 6654 阅读 · 0 评论 -
若用链表存储一棵二叉树时,每个节点除数据域外,还有指向左孩子和右孩子的两个指针,在这种存储结构中,n歌节点的二叉树共有2N个指针域,其中有N-1个指针域存放了地址,有N+1个指针是空指针。
首先明确几个概念1.链表的节点长什么样子:如下图所示2.节点有左指针域和右指针域,还有一个值域直接举一个简单的例子如图所示通过此图可以看出,有三个节点,那相应的指针域有3*2=6个,有两个指针域中有数据(3-1=2),有四个指针域为空(3+1=4)。这里的3都代表三个节点。通过此图可以很清楚的看出。转发:https://blog.csdn.ne...原创 2019-03-02 11:01:20 · 5516 阅读 · 1 评论 -
约瑟夫问题
约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后杀死所有人。于是约瑟夫建议:每次由其他两人一起杀死一个人,而被杀的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在杀了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投降了罗马。我们这个规则是这么...原创 2020-03-19 01:01:34 · 197 阅读 · 0 评论 -
归并排序与快速排序
归并排序void merge_sort(int arr[],int l,int r){ if(l >=r) return ; int mid=(l+r)/2; merge_sort(arr,l,mid); merge_sort(arr,mid+1,r); merge(arr,l,mid,r);}快速排序pr...原创 2019-08-19 10:41:05 · 156 阅读 · 0 评论 -
红黑树详细分析,看了都说好
红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1972年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好的效率,它可在O(logN)时间内完成查找、增加、删除等操作。因此,红黑树...转载 2019-09-20 10:32:00 · 146 阅读 · 0 评论 -
实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式
节点类:public class Node { private int data; private Node left; private Node right; public Node(int data){ this.data = data; } public Node(){ } public int g...原创 2019-02-04 20:57:57 · 548 阅读 · 1 评论 -
复制含有随机指针节点的链表------牛客网初级班练习13
【题目】 一种特殊的链表节点类描述如下:public class Node { public int value; public Node next; public Node rand; public Node(int data) { this.value = d...原创 2019-02-04 16:19:24 · 206 阅读 · 0 评论 -
荷兰国旗问题来改进快速排序------排序4
随机快速排序的细节和复杂度分析可以用荷兰国旗问题来改进快速排序时间复杂度O(N*logN),额外空间复杂度O(logN)具体代码如下:public static void quickSort(int[] arr) { if (arr == null || arr.length < 2) { return; } quickSort(arr, 0,...原创 2019-01-31 18:38:13 · 288 阅读 · 0 评论 -
堆排序的细节和复杂度分析------排序5
时间复杂度O(N*logN),额外空间复杂度O(1)堆结构非常重要1,堆结构的heapInsert与heapify2,堆结构的增大和减少3,如果只是建立堆的过程,时间复杂度为O(N)4,优先级队列结构,就是堆结构完全二叉树:叶子节点从左往右依次补齐左节点:2*i +1右节点:2*i+2父节点:(i-1)/2一个数组可以对应一个完全二叉树: ...原创 2019-02-01 15:31:44 · 297 阅读 · 0 评论 -
排序算法的稳定性及其汇总-------排序6
下面是一个总的表格,大致总结了我们常见的所有的排序算法的特点。 排序法 平均时间 最差情形 稳定度 额外空间 备注 冒泡 O(n2) O(n2) 稳定 O(1) n小时较好 交换 O(n2) O(n2) 不稳定 O(1) n小时较好 选择 O(n2) O(n...原创 2019-02-01 17:10:05 · 201 阅读 · 0 评论 -
桶排序、计数排序、基数排序的介绍
桶排序、计数排序、基数排序的介绍1,非基于比较的排序,与被排序的样本的实际数据状况很有关系,所 以实际中并不经常使用2,时间复杂度O(N),额外空间复杂度O(N)3,稳定的排序补充问题给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序。假设有n个数1)准备n+1个桶2)遍历n个数,找到最大值和最小值3)如果最...原创 2019-02-01 20:04:25 · 185 阅读 · 0 评论 -
用数组结构实现大小固定的队列和栈
固定数组实现栈思路:维护一个index即可,index表示如果新加一个数,这个数应该加在哪个位置,index<size 具体代码如下:public static class ArrayStack { private Integer[] arr; private Integer size; public ArrayStack(int initSize)...原创 2019-02-01 21:14:28 · 264 阅读 · 0 评论 -
牛客网初级班------练习4之猫狗队列
猫狗队列 【题目】 宠物、狗和猫的类如下:public class Pet { private String type; public Pet(String type) { this.type = type; } public String getPetType() { return this.type; } ...原创 2019-02-02 17:53:52 · 240 阅读 · 0 评论 -
牛客网初级班------练习5,练习6
转圈打印矩阵 【题目】给定一个整型矩阵matrix,请按照转圈的方式打印它。 例如:1 2 3 45 6 7 89 10 11 1213 14 15 16打印结果为:1,2,3,4,8,12,16,15,14,13,9, 5,6,7,11, 10...原创 2019-02-02 18:36:36 · 255 阅读 · 0 评论 -
牛客网初级班------练习7之反转单向和双向链表
反转单向和双向链表 【题目】分别实现反转单向链表和反转双向链表的函数。 【要求】 如果链表长度为N,时间复杂度要求为O(N),额外空间 复杂度要求为O(1)具体代码如下:public static class Node { public int value; public Node next; public Node(int data) { this....原创 2019-02-02 18:48:31 · 175 阅读 · 0 评论 -
“之”字形打印矩阵------牛客网初级班练习8
【题目】 给定一个矩阵matrix,按照“之”字形的方式打印这 个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 “之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11, 8,12【要求】 额外空间复杂度为O(1)。思路准备俩个点A,BA每次向右走,遇到最右边则向下走B每次向下走,遇到最下边则向右走A,B每次只各走一步public...原创 2019-02-03 15:53:25 · 265 阅读 · 0 评论 -
在行列都排好序的矩阵中找数------牛客网初级班练习9
【题目】 给定一个有N*M的整型矩阵matrix和一个整数K, matrix的每一行和每一 列都是排好序的。实现一个函数,判断K 是否在matrix中。 例如: 0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 如果K为7,返回true;如果K为6,返 回false。【要求】 时间复杂度为O(N+M),额外空间复杂度为O(1)。举例:一个矩阵如下,查找4 思...原创 2019-02-03 16:03:38 · 452 阅读 · 0 评论 -
认识时间复杂度以及冒泡选择插入排序------排序1
常数时间的操作:一个操作如果和数据量没有关系,每次都是 固定时间内完成的操作,叫做常数操作。时间复杂度为一个算法流程中,常数操作数量的指标。常用O (读作big O)来表示。具体来说,在常数操作数量的表达式中, 只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分 如果记为f(N),那么时间复杂度为O(f(N))。评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实...原创 2019-01-29 01:12:49 · 226 阅读 · 0 评论 -
判断一个链表是否为回文结构------牛客网初级班练习11
【题目】 给定一个链表的头节点head,请判断该链表是否为回 文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。进阶: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)。回文结构:正反念都一样。或者存在一个对称...原创 2019-02-04 15:43:50 · 711 阅读 · 0 评论 -
将单向链表按某值划分成左边小、中间相等、右边大的形式牛客网初级班练习12
【题目】 给定一个单向链表的头节点head,节点的值类型是整型,再给定一个 整 数pivot。实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot 的节点,中间部分都是值等于pivot的节点,右部分都是值大于 pivot的节点。 除这个要求外,对调整后的节点顺序没有更多的要求。 例如:链表9->0->4->5- >1,pivot=3。 调整后链表可以是1->...原创 2019-02-04 15:55:44 · 241 阅读 · 0 评论 -
荷兰国旗问题------排序3
问题一 给定一个数组arr,和一个数num,请把小于等于num的数放在数 组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)思路:遍历的过程指针指向的位置如果小于等于num,则小于等于区域的下一个数和 遍历过程的指针指向的数进行交换 问题二(荷兰国旗问题) 给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,...原创 2019-01-31 15:15:55 · 482 阅读 · 0 评论