数据结构与算法
文章平均质量分 63
数据结构与算法相关文章
算不出来没办法
宁静致远
展开
-
数据结构:栈(C语言描述)
这一篇文章我们谈谈栈。(以下仅代表个人观点,代码和内容有错请指正)主要内容:动态栈的创建初始化、数据入栈、数据出栈、获取栈顶元素、清空栈内元素、获取栈内元素个数、检测栈是否为空、栈扩容和断言、栈的几个应用。我认为栈这种数据结构要说的不是很多,主要就是先进后出这种思想。栈也是一种线性表,既然是线性表那么就有线性表的两种表达形式:顺序栈和链式栈(两者的区别在于存储的数据元素在物理结构上是否是相互紧挨着的)。顺序栈存储元素预先申请连续的存储单元;链式栈有需要才申请,数据元素不紧挨着。我们平时浏览网页返回上原创 2021-07-08 11:47:23 · 4832 阅读 · 0 评论 -
数据结构:静态链表(C语言描述)
这一篇文章我们总结一下静态链表。主要内容:静态链表的创建、申请节点、回收节点、显示节点数据,用数组模拟链表和一些经典题目。(链表的查找、插入、删除、修改操作与动态链表基本一致,这里就不涉及了)其实我认为静态链表在C/C++语言当中作用不是很大,因为C/C++可以直接对地址进行处理,动态分配内存可以很方便的实现某些功能。对于那些不能直接对地址进行处理的语言,例如:Java,静态链表就可以起到一定的作用,从而达到不动用地址也能实现动态链表的功能。①结构体及宏定义如何定义:代码如下,静态链表也可以原创 2021-07-05 23:41:10 · 5382 阅读 · 3 评论 -
数据结构:动态链表(C语言描述)
这一篇文章我们先简单的说一下动态链表,下一篇整理静态链表。主要内容:普通单链表,单向循环链表和双向循环链表,如何判断链表中是否包含环和入环点的确定,以及一些经典题目。①普通单链表:这里我只是简单的定义了一个长度为10的单链表并输出相关内容,并没有写创建、插入、删除、查找等相关功能。对链表熟悉了之后就会发现创建链表的头插法和尾插法只是两个模板而已。下面的代码创建链表的方法就十分简单。普通单链表不从头节点开始遍历就无法遍历完全部的节点。这在某些情况下具有很大的弊端。#include<原创 2021-07-04 22:50:21 · 5615 阅读 · 6 评论 -
数据结构:队列(C语言描述)
主要内容:循环队列的初始化、队满队空的判断、数据出队、数据入队等操作,根据存储结构划分队列的种类。(如有错误,还望指正)队列也是线性表的一种,于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first o原创 2021-07-14 20:19:21 · 4484 阅读 · 2 评论 -
动态规划背包问题总结
常用算法代码模板总结目录01背包问题完全背包问题多重背包问题分组背包问题01背包问题java题解朴素做法import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt();//n件物品 .原创 2022-03-10 17:18:54 · 242 阅读 · 1 评论 -
整数二分、浮点二分代码模板
二分不一定需要有序性,只需要确保二分的两边不同时满足某一性质即可。整数二分整数二分会出现很多边界问题。704. 二分查找 - 力扣(LeetCode) (leetcode-cn.com)java版本class Solution { public int search(int[] nums, int target) { // 二分查找 int right = nums.length - 1; int left = 0; while (left <= r原创 2022-01-15 12:20:48 · 1007 阅读 · 0 评论 -
常用算法代码模板总结
去除数组中重复的元素(双指针)public static void main(String args[]) { int[] nums = { 1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 7 }; int j = 0; for (int i = 0; i < nums.length; i++) {//去除数组当中重复的元素 if (i == 0 || nums[i] != nums[i - 1]) nums[j++] = nums[i]; }原创 2021-12-29 22:24:55 · 2535 阅读 · 6 评论 -
最小生成树之prim算法代码模板
import java.util.Arrays;import java.util.Scanner;public class Main { static int[][] map = new int[510][510]; static int[] dist = new int[510]; static boolean[] st = new boolean[510]; static int n, m; static int INF = Integer.MAX_VALUE / 100; pu.原创 2021-11-23 19:54:51 · 2344 阅读 · 2 评论 -
最小生成树之Kruskal算法代码模板
思路:①记录图中每一条边,按照边的权值来对每一条边进行排序。②枚举每一条边,如果这条边的起点和终点不在同一个集合(也就是a所在的集合和b所在的集合不连通),那么将这条边加入路径当中。例题:给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图G=(V,E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。由V中的全部n个...原创 2021-11-23 19:37:34 · 2229 阅读 · 0 评论 -
多源最短路之floyd算法代码模板
import java.util.Arrays;import java.util.Scanner;public class Main { static int m, n, k; static int[][] map = new int[210][210]; public static void floyd() { for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j =.原创 2021-11-23 19:14:13 · 2124 阅读 · 0 评论 -
单源最短路之Bellman-ford算法代码模板
注意事项:如果图中存在负权回路,那么不一定存在最短路。因为如果在负权回路里无限循环最后走出来最短路为负无穷。例如下图: 但是我们上面说的是如果存在负权回路,不一定存在最短路。为什么呢?因为只要这个负权回路不在初始点到末尾点的路径上,那这个负权回路对最短路没有影响。思想:① 两层循环,第一层循环循环n次,n代表节点的个数。②第二层循环循环m次,m代表边的条数。每次内层循环比较当前边终点存放的距离和当前边起点存放的距离+这条边长度的关系,如果终点存放的距离大于起点存放的距离+这条边的长.原创 2021-11-19 18:09:01 · 2625 阅读 · 1 评论 -
单源最短路之Dijkstra算法代码模板
注意事项:用来求单源最短路所有边权都是正数,时间复杂度O(n^2)可通过堆优化达到时间复杂度为O(mlogn)①数组定义dist[i]数组:表示初始点到某个点的最短路径长度st[i]数组:表示初始点到i这个点的最短路径是否确定map[i][j]数组:存放点之间的关系,例如map[i][j]表示从i点到j点的距离,map[j][i]表示从j点到i点的距离,map[i][i]定义为0。②步骤:(1)首先遍历一遍查找到没有确定到初始点距离的点,并且这个点到初始点的距离应当是原创 2021-11-18 16:59:52 · 2685 阅读 · 0 评论 -
堆排序及模拟堆代码模板
基础知识:大根堆:父节点大于左右子节点小根堆:父节点小于左右子节点父节点下标x,左子节点下标2x,右子节点下标2x+1堆排序代码(重点是Down()函数):import java.util.Scanner;public class Main { static int[] nums = new int[100010]; static int n; // 小根堆构造:x的左节点下标2x,右节点下标2x+1 public static void Down(int x) { i原创 2021-11-13 22:33:05 · 2741 阅读 · 0 评论 -
并查集代码模板
并查集主要用途:①将两个集合合并②查询两个元素是否在同一个集合当中基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点存放父节点。例如:定义一个数组father,father[x]就表示x的父节点。如何判断是否到达了树根?if(father[x]==x) // 只有树根的父节点定义为自己的位置如何求x所处在的集合编号?while(father[x]!=x) //只要存放的父节点和自身不相等,说明不是父节点 x=father[x]; .原创 2021-11-13 17:28:56 · 2578 阅读 · 0 评论 -
Trie树代码模板
只记录题目和代码,Trie字符串统计维护一个字符串集合,支持两种操作:I x向集合中插入一个字符串xx; Q x询问一个字符串在集合中出现了多少次。共有NN个操作,输入的字符串总长度不超过105105,字符串仅包含小写英文字母。输入格式第一行包含整数NN,表示操作数。接下来NN行,每行包含一个操作指令,指令为I x或Q x中的一种。输出格式对于每个询问指令Q x,都要输出一个整数作为结果,表示xx在集合中出现的次数。每个结果占一行。...原创 2021-11-12 21:38:11 · 2186 阅读 · 0 评论 -
进制转换与位运算
进制转换 int p = 15;//long Long.toString(); Long.parseInt(); String str = Integer.toString(p, 2);// 前一个参数是10进制数,后一个数是想要转换的进制 System.out.println(str); int q = Integer.parseInt(str, 2);// 后一个参数表示前一个字符串的进制,转换为10进制表示 System.out.println(q);原创 2021-11-12 16:07:28 · 2363 阅读 · 1 评论 -
前缀和与差分代码模板
一维前缀和 Scanner input=new Scanner(System.in); int n=input.nextInt(); int[] nums=new int[n+10]; int[] result=new int[n+10]; for(int i=1;i<=n;i++){ nums[i]=input.nextInt();//接收数据 }原创 2021-11-12 10:55:39 · 2625 阅读 · 1 评论 -
归并排序实现思想及代码模板
归并排序思想:①划分:将进入方法的数组划分为两部分②递归:递归继续划分,直到个数为1③合并:根据值的大小来合并,小的先放入合并的数组当中。例如:1, 1, 7, 3, 4, 5, 9, 8, 3一直递归到底层 划分为{ 1 , 1 } { 7 } { 3 , 4 } { 5 , 9 } { 8 , 3 }合并{ 1 , 1 , 7 } { 3 , 4 } { 3 , 5 , 8 , 9}合并{ 1 , 1 , 3 , 4 , 7 } { 3 , 5 , 8 ,...原创 2021-11-11 16:58:46 · 2809 阅读 · 4 评论 -
快速排序实现思想及代码模板
快速排序思想:每次遍历选取一个中间值,通过一趟遍历将要排序的数组分成两部分,左部分大于等于中间值,右部分小于等于中间值,然后按照相同的方法对左右部分再进行相同的步骤。例如:对于一组数 10 ,5 ,737 ,23,2 ,11 ,99 ,167以第一个数 10 作为中间值。左指针从头一直移动到大于中间值的那个数的下标位置,也就是737,然后右指针从尾移动到小于中间值的那个数的下标位置,也就是2。然后交换这两个数。...原创 2021-11-11 10:19:28 · 2841 阅读 · 3 评论 -
图解KMP算法原理及其代码分析
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。在这里我想对提出算法的三位神人表达我的敬仰之情,真正理解了该算法的奥秘之后,你就会惊叹此算法是多么的妙!!!本篇文章所讲内容有一定难度,请静下心来体会。相信你一定可以掌握KMP算法的精髓,体会到发明该算法的人的智慧的。在讲解算法原理之前,我们先看看下面的问题。字符串模式匹配问题我们要在主串中查找与子串完全匹配的部分,如图所示。原创 2021-07-15 20:47:15 · 4748 阅读 · 3 评论