![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
__Forever__
Coder;
算法爱好者;
数学建模爱好者;
研究生期间软件硬件都做,-_-||
热爱交朋友,探讨程序世界的美妙;
目前工作从事C,C++,Linux;
邮箱:Fugangli@foxmail.com,欢迎骚扰!
展开
-
求职软件开发工程师,我需要准备什么?一些资源分享
0.前言1.简历1.1 模板。1.2 怎么写2.需要掌握的知识2.1 数据结构2.2 算法2.3 笔试准备2.4 其他知识3.面试0.前言1.少去知乎、脉脉等平台问这个岗位前景如何。去回答的大都是干得不开心的,这是“幸存者效应”。当然不排除少数客观的回答,但是根据我的经验,看多了容易焦虑、彷徨,造成“看一个否定一个”。2.很多大厂都会在牛客网的讨论区招人,七月底就可以去关注了。3.关于内推码,现在已经很普遍了,不要把它当做走了“绿色通道”。1.简历1.1 模板。1.自己花了原创 2020-05-15 11:08:36 · 778 阅读 · 0 评论 -
寻找大数组中位数问题(一)
前言之前在面试的时候,面试官非常喜欢问:你好,请问在一个很大的数组中怎样快速地找出它的中位数?当时很迷惑,为什么面试官总喜欢找中位数?后来了解到快速排序算法的思想后,发现如果大概知道待排序数组中位数的大小(或者提前找出中位数),将在数量级上提高快速排序算法的效率,这个后面有空再讲。如果你想先把数组排序,在找出中间那一个,那就。。。。大家看到算法一定立刻想到时间复杂度和空间复杂度,这是基本的思维方式。我这里提供两个方法,方法一提供代码,可以现场给面试官手撕代码(这就直接发offer了);方法二提原创 2020-05-10 12:09:56 · 2753 阅读 · 0 评论 -
经典算法之(常见)排序算法的比较
1.前言排序算法算是算法中的重中之重,也是面试和工作中的最常用的算法之一。现在我们就来结合例子,一个个分析各大算法的特点。选择一个算法,其实主要是根据待排序的数据特征来选的,一般是在时间复杂度、空间复杂度和算法稳定性之间做取舍。1.1 冒泡排序1.1.2 改进后的冒泡排序1.2 快速排序1.2.2快速排序算法的改进1.3 插入排序1.4 希尔排序1.5 选择排序1.6 堆排序1.7 归并排序4 举例对比各个算法的效率2.各个算法比较算法时间复杂度空间复杂度稳定性原创 2020-05-09 16:11:21 · 359 阅读 · 2 评论 -
合并两个二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:输入:Tree 1 Tree 21 2/ \ ...原创 2019-08-13 09:54:53 · 391 阅读 · 0 评论 -
算法篇之排序
前言:“排序算法类模板”约定:将排序代码放在类sort()方法中,该类还将包含辅助函数less()和exch()。1.排序类算法模板:package sort;public class Sort_mb { public static void sort(Comparable[] a) { // 这里就是各类排序算法的主代码块,如冒泡排序、插入排序、快速排序等 } pr...原创 2019-09-29 10:54:50 · 85 阅读 · 0 评论 -
排序算法之Comparable接口
前言:在创建自己的数据类型时,实现Comparable接口就能保证用例代码可以将其排序,其中的compareTo()方法来实现比较。下面是一个实现Comparable接口的Date例子:public class Date implements Comparable<Date> { private final int day; private final int mont...原创 2019-09-29 11:32:34 · 238 阅读 · 0 评论 -
排序算法之选择排序
选择排序package sort;public class Selection { public static void sort(Comparable[] a) { // 按照升序排列 int N = a.length; // 数组长度 for (int i = 0; i < N; i++) { // 将a[i]和它后面最小的元素进行交换 int min =...原创 2019-09-30 09:50:55 · 88 阅读 · 0 评论 -
排序算法之插入排序
插入排序将每一个数据插入到之前已经有序的数组中,在具体操作中需要将一部分元素向右移动一位。对一个很大的且其中的元素已经有序的数组进行排序,插入排序会比随机顺序的数组快很多。package sort;public class Insertion { public static void sort(Comparable[] a) { // 这里就是各类排序算法的主代码块,如冒泡排序...原创 2019-09-30 10:27:36 · 85 阅读 · 0 评论 -
排序算法之希尔排序
希尔排序基于插入排序的快速排序算法。对于每个h,用插入排序将h个子数组独立地排序。只需要在插入排序的代码中将移动的距离由1改为h即可。package sort;import java.util.Scanner;public class Shell { public static void sort(Comparable[] a) { // 这里就是各类排序算法的主代码块,如...原创 2019-09-30 10:55:37 · 151 阅读 · 0 评论 -
给定一个二叉树,判断它是否是高度平衡的二叉树。
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] ...原创 2019-08-13 09:23:12 · 605 阅读 · 0 评论 -
翻转一棵二叉树。
翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1public TreeNode invertTree(TreeNode root) { if (root == null) { ret...原创 2019-08-12 21:15:08 · 977 阅读 · 0 评论 -
给定一个二叉树,检查它是否是镜像对称的。
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3...原创 2019-08-12 20:53:03 · 1576 阅读 · 0 评论 -
数据结构之树(二)2-3树
2-3树二叉搜索树(BST)和二叉平衡树(AVL),二叉搜索树在最好的情况下搜索的时间复杂度为O(logn),但如果插入节点时,插入元素序列本身就是有序的,那么BST树就退化成一个线性表了,搜索的时间复杂度为O(n)。 如果想要减少比较次数,就需要降低树的高度。在插入和删除节点时,要保证插入节点后不能使叶子节点之间的深度之差大于1,这样就能保证整棵树的深度最小,这就是AVL树解决BST搜索性...转载 2019-07-22 13:01:09 · 236 阅读 · 0 评论 -
数据结构之树(三)2-3-4树与红黑树
2-3-4树1.前言之所以介绍2-3-4树是因为2-3-4树与极为重要的红黑树有着等价关系,通过先学习2-3-4树为后面学习红黑树打下基础,增进对于红黑树的理解。2-3树不再是单纯的二叉树了,因为2-3树中除了2-节点之外还存在3-节点。在2-3树的基础上进一步扩展,2-3-4树在2-3树的基础上添加4-节点。4-节点可以存储3个键值,最多可以拥有4棵子树。2.定义定义(1)每个节点每...转载 2019-07-22 13:07:28 · 253 阅读 · 0 评论 -
数据结构之树(四)B树和B+树
B树1、引言数据库的增删改查等操作是开发过程中最为常见也是尤为重要的,尤其是现在大数据的兴起,导致数据存储量急剧增加,提升数据的操作效率就变得尤为关键。大部分数据库的索引都采用树的结构存储,这是因为树的查询效率相对较高,且保持有序。 对于二叉搜索树的时间复杂度是O(logN),在算法以及逻辑上来分析,二叉搜索树的查找速度以及数据比较次数都是较小的。但是我们不得不考虑一个新的问题。**数据量...转载 2019-07-22 13:19:17 · 256 阅读 · 0 评论 -
数据结构之树(五)霍夫曼编码树
1、概述 霍夫曼编码是一种基于最小冗余编码的压缩算法。最小冗余编码是指,如果知道一组数据中符号出现的频率,就可以用一种特殊的方式来表示符号从而减少数据需要的存储空间。2、定义 霍夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。结合第2...转载 2019-07-22 13:21:44 · 338 阅读 · 0 评论 -
按中序遍历重新排列树
给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。示例 :输入:[5,3,6,2,4,null,8,1,null,null,null,7,9] 5 / \ 3 6 / \ \ 2 4 8 / / \ 1 7 9输出:[1,null...原创 2019-08-13 14:29:37 · 296 阅读 · 0 评论 -
Java编程计算二叉树的深度(二叉树的遍历)
昨天面试拼多多,现场给了一道求解数的宽度的题目。回来想着要把有关树的算法整理一下,1.首先是计算树的深度:public class Solution { public int TreeDepth(TreeNode root) { if(root==null) return 0; int left=TreeDepth(root.le...转载 2019-08-11 18:49:51 · 1329 阅读 · 2 评论 -
Java判断树t是不是树s的子树
题目:给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例 1:给定的树 s: 3 / \ 4 5 / \ 1 2给定的树 t: 4 / \ 1 2返回 true,因为 t 与 s 的一个子树拥有相同的...原创 2019-08-11 19:37:24 · 334 阅读 · 0 评论 -
把树变成累加树(逆中序遍历法)
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。例如:输入: 二叉搜索树: 5 / \ 2 13输出: 转换为累加树: 18 / \ 20 13class Solution { int su...原创 2019-08-11 21:05:42 · 520 阅读 · 0 评论 -
数据结构之树(一)
树概念:1.节点的度:节点拥有的子树数目称为节点的度。2.树的深度:树中节点的最大层次数称为树的深度或高度。二叉树(1)每个节点最多有两颗子树,所以二叉树中不存在度大于2的节点。(2)左子树和右子树是有顺序的,次序不能任意颠倒。(3)即使树中某节点只有一棵子树,也要区分它是左子树还是右子树。满二叉树满二叉树:在一棵二叉树中。如果所有分支节点都存在左子树和右子树,并且所有叶子都在同...原创 2019-07-22 12:54:01 · 91 阅读 · 0 评论