GitHub - mahong978/Algorithm: 算法和数据结构学习,Java实现

算法和数据结构学习👾

由于大二和大三时运气不好,没有选到算法导论这门课,然后自己在这方面也有所怠惰,因此一直没怎么注意算法还有数据结构这一块,最近阅读了相关书籍还有一些CSDN上的博文,算是学习到了不少内容。正所谓“三天不练手生”,学习算法也是要实战才能加深记忆,因此在每学一道题目后都将整合到这个仓库中,与君分享

结构

大致分为两块,algorithm和dataStructure,algorithm中主要是包含跟数组、字符串有关的算法,dataStructure中主要是包含各种数据结构的包装,以及跟数据结构有关的题目

内容

数组与字符串

位运算实现加减乘除

BitOperation

斐波那契

Fibonacci

元素两两出现的数组中找出唯一的数

FindTheSingle

元素两两出现的数组中找出两个唯一的数

FindTheTwoSingle

全组合

FullCombination

全排列

FullPermutation

找出数组中前k个最小的元素

KLeastElement

最大和连续子数组

MaxSumSubArray

反转单词

ReverseWords

排序算法

Sort

和为k的两个元素

TwoElementWithSum

杨氏矩阵查找

YoungMatrixSearch


数据结构

数据结构这部分涉及到各种链表、树之类的节点定义和构造方式。

节点定义在util包中的Node.java,Node类只有一个成员,类型是int,设置了toString()方法为返回value,直接子类有LinkedNode和BinaryNode。LinkedNode是链表节点,BinaryNode是二叉树节点。

至于链表和二叉树的构造方式,因为手动创建对象再连接的方式又麻烦又难看,所以在LinkedNode和BinaryNode中添加了静态的Builder类,使用Builder类来构建链表和二叉树:

LinkedNode.Builder中只有一个静态函数convert,接受int类型的可变参数列表,将该数组转换成链表,并返回头节点,使用示例:

LinkedNode head = LinkedNode.Builder.convert(1, 2, 3, 4, 5, 6, 7, 8);

BinaryNode.Builder的构造函数接受一个int参数,表示根节点的value;addChild方法接受两个int参数,分别表示左节点的value和右节点的value,如果没有左节点或右节点,使用标志NULL_CHILD;build方法返回根节点。构造树的顺序是从上到下,从左到右,使用示例:

BinaryNode root = new BinaryNode.Builder(10)
				.addChild(4, 16)
				.addChild(2, 7)
				.addChild(15, 20)
				.build();

链表

倒数第k个节点

LastKNode

两链表最近公共节点

NearestPublicNode

两栈实现队列

QueueWithTwoStack


和为k的路径

FindPathWithSum

检验后序遍历

IsCorrectPostOrder

相隔最远的两叶子结点的距离

LongestDistance

镜像二叉树

MirrorBinaryTree

打印二叉树

PrintBinaryTree

根据前序遍历和中序遍历重建二叉树

RebuildBinaryTree

遍历二叉树

Traverse

二叉树转换成链表

TreeToLinkedList


带有min函数的栈

StackWithMin

两队列实现栈

StackWithTwoQueue