
数据结构与算法
文章平均质量分 65
数据结构与算法,会长期的更新下去
m旧裤子
热爱生活,热爱编程
展开
-
N层汉诺塔(Hanoi)问题详解(java实现)
相传在古印度的一座圣庙中 ,有一种叫做汉诺塔的游戏。该游戏是在一块铜板装置上,有三根杆子A、B、C,初始,A杆上从上到下由小到大放着盘子。游戏目的与规则,把A杆上的金盘全部移动到C杆上,并仍保持着原有的顺序。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持着大盘子在下,小盘在上,移动过程中盘子可以在A、B、C任意一个杆上。原创 2023-05-14 10:45:42 · 938 阅读 · 2 评论 -
最短路径算法-迪杰斯特拉(Dijkstra)
迪杰特斯拉算法主要特点是从起始点开始,采用贪心算法的策略,由每步最优解最后得出全局最优解,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。解法一每次选择桥连点的时候都需要从新遍历Map集合,浪费时间,可以使用小根堆,每次选择桥连点的时候就只需要拿出小根堆的堆顶就行,这里需要按照自己解题思路手写改编小根堆结构。把相邻的点依次放入map集合中,然后依次遍历比较最后得出离出发点最短的点,每一步都按照这样的策略,最后得出所有点的最短路径。从一个点出发,从相邻的点中选出离出发点最短的点。原创 2023-04-02 11:09:50 · 1149 阅读 · 0 评论 -
图算法之Kruskal(克鲁斯卡尔)、Prim(普里姆算法)
首先我们把所有的边按照权值先从小到大排列,接着按照顺序选取每条边,如果这条边的两个端点不属于同一集合,那么就将它们合并,直到所有的点都属于同一个集合,就生成了最小生成树。Kruskal算法依照的是贪心算法思想,总是在局部的当前步做出最优决定,最后得到全局最优决定。判断和合并过程中会使用到并查集结构。Prim基于贪心算法思想,由图中一个点出发,从这个点出发的所有边中,挑选出权值最小的边(总是在当前步做出最优决定),从而把这两个点连通,按照这个策略,最后生成最小生成树(最后得出全局最优决定)。原创 2023-03-19 16:34:03 · 647 阅读 · 0 评论 -
图(图的宽度优先遍历(BFS)&&图的深度优先遍历(DFS)&&图的拓扑排序)
2)把所有入度为0的点在图中删掉,继续找入度为0的点输出,周而复始。一条路走到黑,走不通了再回到上一个岔路口,直到走完整个结构。那么拓扑排序的结果为D一定在ABC后,但是ABC的顺序不一定。先遍历与当前结点相邻的结点,再遍历深一层的结点,层层递进。3)图的所有点都被删除后,依次输出的顺序就是拓扑排序。如果有这样的一个图结构,A依赖D,B依赖D,C依赖D。1)在图中找到所有入度为0的点输出。要求:有向图且其中没有环。应用:事件安排、编译顺序。原创 2023-02-26 17:35:45 · 184 阅读 · 0 评论 -
判断一颗树是否为二叉搜索树(isBST)、满二叉树(isFBT)、完全二叉树(isCBT)、平衡二叉树(isBalancedTree)
定义:它或者是一棵空树,或者是具有下列性质的 二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的 根结点 的值;一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。根据满二叉树节点总数=(2^k-1)的定义,我们可以求出这棵树左子树的深度和节点总数和右子树的深度和节点总数,然后求左右子树深度的最大值和左右子树的节点总数和,最后利用定义判断是否符合。原创 2022-11-20 17:53:18 · 1188 阅读 · 0 评论 -
距离顺序排列矩阵单元格
给定四个整数 rows , cols , rCenter 和 cCenter。有一个 rows x cols 的矩阵,你在单元格上的坐标是 (rCenter, cCenter)。返回矩阵中的所有单元格的坐标,并按与 (rCenter, cCenter) 的 距离 从最小到最大的顺序排。你可以按 任何 满足此条件的顺序返回答案。单元格(r1, c1) 和 (r2, c2) 之间的距离为|r1 - r2| + |c1 - c2|。原创 2022-11-12 09:04:09 · 166 阅读 · 0 评论 -
二叉树的前、中、后序遍历(递归与非递归)
当传入一个二叉树结构的头节点时,按照上面的cur方法,二叉树结构中的每一个节点都会出现经历次,且有一定的顺序。我们暂且称之为递归序。而二叉树中的前、中、后序遍历(递归)就根据这个递归序演变而来。前序遍历就相当于每个节点在递归序中第一次出现,打印。中序遍历就相当于每个节点在递归序中第二次出现,打印。后序遍历就相当于每个节点在递归序中第三次出现,打印。...原创 2022-08-10 11:00:48 · 253 阅读 · 0 评论 -
链表(三)
判断链表是否为回文结构,将单向链表按某值划分成左边小、中间相等、右边大的形式,复制含有随机指针节点的链表,两个单链表相交的一系列问题原创 2022-07-31 22:21:13 · 262 阅读 · 0 评论 -
入门算法总结
洛谷入门一到六方法总结原创 2022-01-29 19:20:38 · 1036 阅读 · 0 评论 -
C语言4*5矩阵
C语言4*5矩阵再看这道题的时候,发现自己有两个误区。一、for循环的执行步骤二、程序中j,n的值#include<stdio.h>int main(){ int i,j,n=0; for(i=1;i<=4;i++) { for(j=1;j<=5;j++,n++) { if(n%5==0) printf("\n"); printf("(%d)",j); printf("%d\t",i*j); } printf("\n");原创 2021-03-12 22:15:21 · 3402 阅读 · 1 评论 -
c语言 (冒泡法,选择法,折半查找法,插入法)
c语言 (冒泡法,选择法,折半查找法,插入法)冒泡法(1)从第一个数开始,相邻两个数两两比较,将大的(或小的)交换到后面,然后继续比较第2、3个数……当比较完最后两个数的时候,最大数(或最小数)便排在最后了。此过程称为“一趟”。(2)将最大数排除在外,其余数重复步骤1。(3)重复步骤2,直到所有数都排好为止。#include<stdio.h>int main(){ int i,j,a[6],t; printf("输入六个整数:\n"); for(i=0;i<=5;原创 2020-12-26 21:14:47 · 646 阅读 · 2 评论 -
简单排序(Java)
Java选择冒泡插入排序原创 2022-01-22 21:50:27 · 541 阅读 · 0 评论 -
程序员必备的八大排序算法
一、冒泡排序这个排序应该是大部分程序员刚学习代码接触的第一个排序算法,它的原理也很简单,相邻的元素进行比较,满足条件就进行交换,总共需要遍历n轮。到n轮进行完之后,整体就会有序。public staic void bubbleSort(int arr[]){ for(int i=0;i<arr.length;i++){ for(int j=0;j<arr.length-i-1;j++){ int temp=0; if(arr[j]>arr[j+1]){ //满足条件就原创 2022-02-27 15:05:20 · 9437 阅读 · 0 评论 -
链表(二)
双链表实现双端队列,k个节点的组内逆序调整,两链表相加,合并有序链表原创 2022-07-11 11:09:09 · 177 阅读 · 0 评论 -
链表(一)
单链表反转,双链表反转,单链表实现队列,单链表实现原创 2022-06-18 22:36:10 · 128 阅读 · 0 评论 -
排序算法--两个数组元素之间关系(两个数组交集,分发饼干)
排序算法–两个数组交集归并排序:其原理就相当于把数组分成左右两等份数组,让数组左右两边先各自排好序,然后再让数组整体有序。文章:八大排序算法在一部分的排序算法中求两数组元素的关系中都会用到归并排序算法的原理思想。题目一给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。思路:运用归并排序中不同数组中的双指针思想,首先把要求交集的两个数组进行排序,然后创建两个双指针变量,运用双指针来对两数组中的元素一一比较。原创 2022-04-02 10:20:26 · 568 阅读 · 0 评论