算法
文章平均质量分 56
算法
龍弟-idea
华为云享专家,阿里云专家博主,JAVA领域新星创作者,HDZ核心组成员,全网粉丝1万+
展开
-
JAVA基础练习——30题
一、闰年的判断给定一个年份,判断这一年是不是闰年。 当以下情况之一满足时,这一年是闰年,年份是4的倍数而不是100的倍数;年份是400的倍数。 其他的年份都不是闰年。 输入格式 输入包含一个整数y,表示当前的年份。 输出格式 输出一行,如果给定的年份是闰年,则输出yes,否则输出no。public class base01{ public static void main(String[] arg...原创 2022-02-10 12:28:47 · 1038 阅读 · 10 评论 -
数据结构——【图的进阶】
目录有向图有向图API设计有向图的实现拓扑排序拓扑排序检测有向图中的环基于深度优先的顶点排序拓扑排序实现有向图有向图的定义及相关术语定义∶有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着一对有序的顶点。出度∶由某个顶点指出的边的个数称为该顶点的出度。入度:指向某个顶点的边的个数称为该顶点的入度。有向路径︰由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点。有向环∶—条至少含有一条边,.原创 2022-01-28 08:30:00 · 1227 阅读 · 0 评论 -
数据结构——【图的入门】
图的定义定义∶图是由一组顶点和一组能够将两个顶点相连的边组成的特殊的图:1.自环:即一条连接一个顶点和其自身的边;2.平行边∶连接同一对顶点的两条边;图的分类:按照连接两个顶点的边的不同,可以把图分为以下两种:无向图:边仅仅连接两个顶点,没有其他含义;有向图:边不仅连接两个顶点,并且具有方向;无向图相邻顶点∶当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并且称这条边依附于这两个顶点。度∶某个顶点的度就是依附于该顶点的边的个数子图:是一幅图的所有边.原创 2022-01-23 13:01:19 · 728 阅读 · 4 评论 -
数据结构——【并查集】
并查集是一种树型的数据结构,并查集可以高效地进行如下操作︰查询元素p和元素q是否属于同一组合并元素p和元素q所在的组并查集结构并查集也是一种树型结构,但这棵树跟我们之前讲的二叉树、红黑树、B树等都不一样,这种树的要求比较简单:1.每个元素都唯一的对应一个结点;2.每一组数据中的多个元素都在同一颗树中﹔3.一个组中的数据对应的树和另外一个组中的数据对应的树之间没有任何联系;4.元素在树中并没有子父级关系的硬性要求;...原创 2022-01-19 18:46:07 · 142 阅读 · 5 评论 -
数据结构——【B树与B+树】
目录B树的特性B树存储数据B树在磁盘文件中的应用B+树的特性B+树存储数据B+树和B树的对比B+树在数据库中的应用B树是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(logn)的时间复杂度进行查找、顺序读取、插入和删除等操作。B树的特性B树中允许一个结点中包含多个key,可以是3个、4个、5个甚至更多,并不确定,需要看具体的实现。现在我们选择一个参数M,来构造一个B树,我们可以把它称作是M阶的B树,那么该树会具有如下特点:·每个结点最多有M-1个key原创 2022-01-20 15:47:46 · 1124 阅读 · 9 评论 -
JAVA基础算法题
(一)统计从1到N的整数中,所有立方值的平方根为整数的数的格式 输入说明:整数N(N<10000) 输出说明:符合条件的数的个数,如4^3= 64 = 8^2 输入样例:10 输出样例:3 (说明:样例中符合条件的3个数是1、4、9)public class Main{ public static void main(String[] args) { Scanner sc=new S原创 2021-12-23 10:33:58 · 1471 阅读 · 24 评论 -
数据结构——平衡树【2-3查找树、红黑树】
查找树的定义:一棵标准的二叉查找树中的结点称为2-结点(含有一个键和两条链),而现在我们引入3-结点(含有两个键和三条链)。2- 结点: 含有一个键( 及其对应的值 ) 和两条链,左链接指向 2-3 树中的键都小于该结点,右链接指向的 2-3 树中的键都大于该结点。3-结点: 含有两个键 ( 及其对应的值 ) 和三条链,左链接指向的 2-3 树中的键都小于该结点,中链接指向的 2-3 树中的键都位于该结点的两个键之间,右链接指向的2-3 树中的键都大于该结点。查找将二叉查找树的查找算...原创 2022-01-17 12:38:03 · 442 阅读 · 13 评论 -
数据结构——优先队列
优先队列:队列中的元素有优先级优先队列按照其作用可以分为以下两种:①最大优先队列:可以获取并删除队列中的最大元素无论入队的顺序,当前最大的元素先出列②最小优先队列:可以获取并删除队列中的最小元素无论入队的顺序,当前最小的元素先出列最大优先队列由于堆这种结构是可以方便删除最大值,因此,可以直接用堆结构实现优先队列堆结构:数据结构——堆_龍弟-idea的博客-CSDN博客最小优先队列之前的堆结构为最大堆1.最大的元素放在数组的索引1处。2.每个结点的数据...原创 2021-12-11 09:43:03 · 2098 阅读 · 19 评论 -
LeetCode——日常刷题(三)
第一题:1108. IP 地址无效化代码实现class Solution { public String defangIPaddr(String address) { StringBuffer stringBuffer=new StringBuffer(); for(int i=0;i<address.length();i++){ if(address.charAt(i) == '.'){ .原创 2021-12-22 09:36:04 · 471 阅读 · 28 评论 -
数据结构——堆
堆的特性∶1.它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层从左到右都是满的,如果最后一层结点不是满的,那么要求左满右不满。2.它通常用数组来实现。具体方法就是将二叉树的结点按照层级顺序放入数组中,根结点在位置1,它的子结点在位置2和3,而子结点的子结点则分别在位置4,5,6和7,以此类推。...原创 2021-12-09 08:00:00 · 256 阅读 · 21 评论 -
LeetCode——日常刷题(二)
第一题:155. 最小栈代码实现class MinStack { Stack<Integer> stack; Stack<Integer> MinStack; public MinStack() {//构造两个栈,一个普通栈,一个辅助栈 stack = new Stack<>(); MinStack = new Stack<>(); } public void .原创 2021-12-06 12:31:51 · 318 阅读 · 24 评论 -
LeetCode——日常刷题(一)
目录第一题: 118. 杨辉三角第二题: 33. 搜索旋转排序数组第三题: 81. 搜索旋转排序数组 II第四题: 153. 寻找旋转排序数组中的最小值第五题: 70. 爬楼梯 第六题: 509. 斐波那契数第七题: 1137. 第 N 个泰波那契数第八题: 2006. 差的绝对值为 K 的数对数目第九题: LCP 01. 猜数字 第十题: LCP 06. 拿硬币第一题:118. ...原创 2021-12-01 08:00:00 · 1891 阅读 · 19 评论 -
数据结构——【二叉树】
树的基本定义树是由n ( n>=1 )个有限结点组成一个具有层次关系的集合。根朝上,而叶朝下。树具有以下特点:1.每个结点有零个或多个子结点;2.没有父结点的结点为根结点;3.每一个非根结点只有一个父结点;4.每个结点及其后代结点整体上可以看做是一棵树,称为当前结点的父结点的一个子树;树的相关术语结点的度︰一个结点含有的子树的个数称为该结点的度;叶结点∶度为0的结点称为叶结点,也可以叫做终端结点分支结点︰度不为0的结点称为分支结点,也可以叫做非终端结点结点的层次原创 2021-12-02 09:57:44 · 1293 阅读 · 8 评论 -
数据结构——符号表
目录符号表API设计符号表代码实现有序符号表符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。符号表中,键具有唯—性。符号表在实际生活中的使用场景是非常广泛的,见下表:应用 查找目的 键 值 字典 找到单词的释义 单词 释义 图书索引 找到某个术语相关的页码 术语 一串页码 网络搜索 找到某个关键字对应的网页 .原创 2021-11-30 21:44:50 · 1600 阅读 · 1 评论 -
数据结构——栈和队列
栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后个数据被第一个读出来)。数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈。栈的API设计类名 Stack 构造方法 Stack():创建Stack对象 成员方法 1.public boolean isEmpty():判断栈是否为空 2.public int size():获取栈中的原创 2021-11-30 08:00:00 · 2094 阅读 · 23 评论 -
数据结构——双向链表、循环链表
目录双链表的实现 java中LinkedList实现链表的复杂度分析循环链表双向链表,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用来存储数据,其中一个指针域用来指向其后继结点,另一个指针域用来指向前驱结点。链表的头结点的数据域不存储数据,指向前驱结点的指针域值为null...原创 2021-11-29 08:00:00 · 3231 阅读 · 19 评论 -
数据结构——单向链表
链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列的结点(链表中的每一个元素称为结点)组成,结点可以在运行时动态生成。结点API设计类名 Node 构造方法 Node(T t, Node next ):创建Node对象 成员变量 T element:存储数据 Node next:指向下一个结点 结点类实现://结点类public class Node<T> { /原创 2021-11-28 08:00:00 · 2541 阅读 · 3 评论 -
十大排序算法——桶排序
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket Sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。public class BucketSort { static final int DEFAULT_INITIAL_CAPACITY = 10; // 默认 10,这里具体看你的数据的量 priva原创 2021-11-24 16:14:37 · 2467 阅读 · 2 评论 -
十大排序算法——计数排序
计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。计数排序代码实现public class CountingSort { private static int[] countingSort(int[] arr) { //1、求取最大值和最小值,计算中间数组的长度:中间数组是用来记录原始数据中每个值出现的频率 int min = arr[原创 2021-11-23 09:27:43 · 3659 阅读 · 27 评论 -
十大排序算法——基数排序
相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作。基数排序是一种按记录关键字的各位值逐步进行排序的方法。此种排序一般适用于记录的关键字为整数类型的情况。所有对于字符串和文字排序不适合。实现:将所有待比较数值(自然数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。基数排序代码实现public class RadixSort { private stati.原创 2021-11-25 11:05:43 · 2433 阅读 · 1 评论 -
十大排序算法——堆排序
堆分为两种:大顶堆和小顶堆,两者的差别主要在于排序方式。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。堆排序代码实现public class HeapSort { private static void heapSort(int[] arr) { // 构造初始堆(大顶堆),从第一个非叶子节点开始调整,左右孩子节点中较大的交换到父节点中 for (in原创 2021-11-22 21:22:17 · 2908 阅读 · 0 评论 -
十大排序算法——快速排序
快速排序是对冒泡排序的一种改进。快速排序原理1.首先设定一个分界值,通过该分界值将数组分成左右两部分﹔2.将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值;3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。4.重复上述过程,可以看出,这是一个递归定义。通过递归将原创 2021-11-21 11:07:59 · 4901 阅读 · 43 评论 -
十大排序算法——归并排序
目录归并排序原理归并排序API设计归并排序代码实现归并排序的时间复杂度分析归并排序是采用分治法的一个非常典型的应用。先使每个子序列有序,再使子序列段间有序,也就是将已有的子序列合并,得到完全有序的序列;如果将两个有序表合并成一个有序表,称为二路归并。归并排序原理1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。⒉将相邻的两个子组进行合并成一个有序的大组。3.不断的重复步骤2,直到最终只有一个组为止。归并排序API原创 2021-11-18 08:00:00 · 3537 阅读 · 14 评论 -
十大排序算法——希尔排序
目录希尔排序原理希尔排序的API设计希尔排序的代码实现希尔排序是插入排序的一种,又称"缩小增量排序”,是插入排序算法的一种更高效的改进版本。希尔排序原理1.选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组。2.对分好组的每一组数据完成插入排序。3.减小增长量,最小减为1,重复第二步操作。希尔排序的API设计类名 Shell 构造方法 Shell():创建Shell对象 成员方法 1.public static void s原创 2021-11-17 08:00:00 · 2508 阅读 · 0 评论 -
十大排序算法——插入排序
目录插入排序原理插入排序API设计插入排序代码实现插入排序的时间复杂度分析插入排序原理①把所有元素分成已排序和未排序两组②找到未排序组的第一个元素,向已经排序的组中进行插入③倒序遍历已经排好的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他元素向后移动一位插入排序API设计类名 Insertion 构造方法 Insertion():创建Insertion对象 成员方法 1.p.原创 2021-11-16 11:25:30 · 3624 阅读 · 1 评论 -
十大排序算法——选择排序
目录选择排序原理选择排序API设计选择排序代码实现选择排序的时间复杂度选择排序原理①假设第一个索引处的元素为最小值,和其他值进行比较,如果当前的索引处的元素大于其他某个索引处的值,则假定其他某个索引处的值为最小值,最后找到最小值所在的索引②交换第一个索引处和最小值所在的索引处的值选择排序API设计类名 Selection 构造方法 Selection():创建Selection对象 成员方法 1.public static void so原创 2021-11-16 08:00:00 · 2953 阅读 · 2 评论 -
十大排序算法——冒泡排序
目录冒泡排序原理冒泡排序API设计冒泡排序的代码实现冒泡排序的时间复杂度分析冒泡排序原理①比较相邻的元素,如果前一个元素比后一个元素大,则交换这两个元素的位置②对每一对相邻的元素循环上面的步骤,最终最后面的元素就是最大值冒泡排序API设计类名 Bubble 构造方法 Bubble:创建Bubble对象 成员方法 1.public static void sort(Comparable[] a):对数组内元素进行排序 2.priva原创 2021-11-15 21:04:22 · 3665 阅读 · 9 评论 -
数据结构与算法——时间与空间复杂度
目录时间复杂度空间复杂度时间复杂度大O记法执行次数=执行时间大O记法有以下几个规则:①用常数1取代运行时间中的所有加法常数;如:O(5),用O(1)来表示。②在修改后的运行次数中,只保留高阶项;如:O(2n^2+3n+1),则时间复杂度为O(n^2)③如果最高阶项存在,且常数因子不为1,则去除与这个项相乘的常数;如:O(5n),则时间复杂度应该为O(n)常见的时间复杂度:描述 增长的数量级 说明 举例 常数级别原创 2021-11-12 22:14:39 · 5801 阅读 · 12 评论 -
LeetCode——剑指 Offer 61【 扑克牌中的顺子】
题目剑指 Offer 61. 扑克牌中的顺子题目概述:从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例输入: [1,2,3,4,5]输出: True输入: [0,0,1,2,5]输出: True基础框架class Solution { public boolean isStraight(int[] nums原创 2021-11-10 09:00:00 · 5411 阅读 · 0 评论 -
LeetCode——剑指 Offer 57【 和为s的两个数字】
题目剑指 Offer 57. 和为s的两个数字题目概述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。限制:1 <= nums.length <= 10^5 1 <= nums[i]<= 10^6基础框架class Solution { .原创 2021-11-07 16:02:29 · 10546 阅读 · 7 评论 -
LeetCode——剑指 Offer 53 - II【0~n-1中缺失的数字】
题目剑指 Offer 53 - II. 0~n-1中缺失的数字题目描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例输入: [0,1,3]输出: 2输入: [0,1,2,3,4,5,6,7,9]输出: 8限制:1 <= 数组长度 <= 10000基础框架class Solution { public int原创 2021-11-02 12:39:35 · 4657 阅读 · 4 评论 -
LeetCode——剑指 Offer 53 - I【 在排序数组中查找数字 I】
目录题目解题思路代码详解题目剑指 Offer 53 - I. 在排序数组中查找数字 I题目概述统计一个数字在排序数组中出现的次数。示例输入: nums = [5,7,7,8,8,10], target = 8输出: 2输入: nums = [5,7,7,8,8,10], target = 6输出: 0基础框架class Solution { public int search(int[] nums, int target) {原创 2021-11-01 19:43:04 · 4990 阅读 · 0 评论 -
LeetCode——剑指 Offer 42【连续子数组的最大和】
题目剑指 Offer 42. 连续子数组的最大和题目概述输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。基础框架class Solution { public int maxSubArray(int[] nums) { }}解题思路...原创 2021-11-01 16:10:29 · 4854 阅读 · 0 评论 -
LeetCode——剑指 Offer 40【最小的k个数】
题目剑指 Offer 40. 最小的k个数题目概述输入整数数组arr,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]输入:arr = [0,1,2,1], k = 1输出:[0]基础框架class Solution { public int[] getLeastNumbers(int[] arr, in...原创 2021-11-01 15:48:30 · 4993 阅读 · 0 评论 -
LeetCode——剑指 Offer 39【数组中出现次数超过一半的数字】
题目剑指 Offer 39. 数组中出现次数超过一半的数字题目概述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2基础框架class Solution { public int majorityElement(int[] nums) { }}解题思路代码详解...原创 2021-11-01 15:38:32 · 4615 阅读 · 0 评论 -
LeetCode——剑指 Offer 29【顺时针打印矩阵】
题目剑指 Offer 29. 顺时针打印矩阵题目概述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]输入:matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]基础框架class Solution { public int[] .原创 2021-11-01 10:45:44 · 4688 阅读 · 0 评论 -
LeetcCode——剑指Offer21【调整数组使其奇数位于偶数前面】
题目剑指 Offer 21. 调整数组顺序使奇数位于偶数前面题目概述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。示例:输入:nums =[1,2,3,4]输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。基础框架class Solution{ public int[] exchange(int[] nums){ }}解题思路利用双指针求解代码详解.原创 2021-11-01 08:00:00 · 4714 阅读 · 0 评论 -
LeetCode——剑指offer17【打印从1到最大的n位数】
题目剑指 Offer 17. 打印从1到最大的n位数题目概述:输入数字n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]基础框架class Solution { public int[] printNumbers(int n) { }}解题思路for循环直接遍历即可!①利用Math函数的pow方法生成末.原创 2021-10-31 21:33:36 · 8717 阅读 · 0 评论 -
LeetCode——剑指offer11【旋转数组的最小数字】
题目剑指 Offer 11. 旋转数组的最小数字题目概述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例输入:[3,4,5,1,2]输出:1输入:[2,2,2,0,1]输出:0基础框架class Solution { public int minArray(int[] nu...原创 2021-10-30 08:35:12 · 4845 阅读 · 0 评论 -
LeetCode——剑指offer03【数组中重复的数字】
目录题目解题思路:代码详解题目剑指 Offer 03. 数组中重复的数字题目概述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000基础框架class Soluti原创 2021-10-29 11:27:37 · 4815 阅读 · 12 评论