数据结构
精心选择的数据结构可以带来更高的运行或者存储效率。
唐 昊
稳扎稳打,步步为营
展开
-
两个栈实现队列
package leetcode.lianbioa.project;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class Day3 { public static Stack<Integer> stack1 = new Stack<>(); public static Stack<Integer> stack2 = new Sta原创 2022-03-29 12:04:51 · 363 阅读 · 1 评论 -
BM19 寻找峰值
解法一:使用目标值遍历比较 public static int findPeakElement(int[] nums) { if (nums.length < 3) { if(nums.length == 1 ){ return 0; } return nums[0] > nums[1] ? 0:1; } // write code here原创 2022-03-29 12:03:52 · 464 阅读 · 2 评论 -
字符串逆序输出
使用StringBuilder的方式 public static String form(String arr){ LocalDateTime begin = LocalDateTime.now(); StringBuilder stringBuilder = new StringBuilder(); StringBuilder append = stringBuilder.append(arr); StringBuilder reverse原创 2022-03-25 17:44:18 · 349 阅读 · 2 评论 -
合并k个已排序的链表
采用逐步遍历 public ListNode mergeKLists(ArrayList<ListNode> lists) { ListNode root = new ListNode(-1); for(int i = 0 ;i< lists.size();i++){ root.next = mergeTwoLists(root.next,lists.get(i)); } return原创 2022-03-22 16:26:25 · 1063 阅读 · 3 评论 -
判断链表是否有环
哈希存储 public boolean hasCycle(ListNode head) { HashSet<ListNode> map = new HashSet<ListNode>(); ListNode temp = head; while(temp != null){ if(map.contains(temp)){ return true;原创 2022-03-22 16:24:57 · 555 阅读 · 2 评论 -
输入两个有序链表,合并后反转该链表
问题描述输入:[1,2,3] [4,5,6]输出:6 5 4 3 2 1代码实现package leetcode.lianbioa;import java.util.ArrayList;public class test1 { public static void main(String[] args) { Node node = new Node(1); Node node1 = new Node(2); Node node2 = n原创 2022-03-21 19:46:43 · 951 阅读 · 4 评论 -
找出最小的 K 个数
问题描述给定一串无序数组,给定K值,需要找出从1-k个有序数字例如:[1,2,5,3,2,3] k = 2输出:1 2解题思路利用堆排序对该数组进行排序,并每次取出堆顶元素,取出K个即可时间复杂度 O(logn)构建大顶堆 public void buildHeap(int[] input) { // for (int i = input.length / 2 - 1; i >= 0; i--) { adjustHeap原创 2022-03-19 11:15:05 · 289 阅读 · 1 评论 -
顺序储存二叉树----(韩顺平数据结构)笔记
顺序存储二叉树从数据储存来看,数组存储方式和树的存储方式可以转换,即数组可转换成树,树也可以转换成数组按照二叉树的构造,要以数组的形式去储存arr[1,2,3,4,5,6]在遍历数组arr时,可以前序中序后序的形式去遍历顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第n个元素的左子节点 2 * n + 1第n个元素的右子节点为 2 * n + 2第n个元素的父节点为 (n - 1 )/2n 表示二叉树的第几个袁术...原创 2022-02-27 10:29:09 · 282 阅读 · 0 评论 -
基数排序算法回顾---(韩顺平数据结构)笔记
算法步骤原创 2022-02-27 10:14:51 · 769 阅读 · 0 评论 -
平衡二叉树(AVL)---(韩顺平数据结构)笔记
平衡二叉树基本介绍也叫平衡二叉搜索树,又被称为AVL树,可以保证查询效率较高具有以下的特点:他是一颗空树或者它的左右两个子树的高度差不能超过1,并且左右两个子树都是一颗平衡二叉树,平衡二叉树的常用实现方法有红黑树,AVL,替罪羊树,Treap,伸展树等...原创 2022-02-24 11:27:30 · 411 阅读 · 1 评论 -
线索化二叉树---(韩顺平数据结构)笔记
package tree.threadedbinarytree;import java.util.concurrent.SynchronousQueue;public class ThreadedBinaryTreeDemo { public static void main(String[] args) { //测试一把中序线索二叉树的功能 HeroNode root = new HeroNode(1, "tom"); HeroNode node2 = new HeroNode(3原创 2022-02-23 10:26:01 · 549 阅读 · 1 评论 -
骑士周游算法---(韩顺平数据结构)笔记
骑士周游问题的解决步骤和思路创建棋盘chessBoard是一个二维数组将当前位置设置为已经访问,然后根据当前的位置,计算马儿能走到哪个位置,并放入到一个集合中,而集合最大为8个数据,每走一步就递归,并且step + 1将集合按照非递减的形式排列,提高效率,再循环试走,如果走通,递归尝试,不通则回溯设置标志位,进行判断,如果全部遍历(使用step和应该走的步数进行比较,如果没有达到数量,则将整个棋盘置空)贪心算法优化算法对于遍历获取的步骤集合的先后顺序进行优化,进行非递减排序9,7,原创 2022-02-22 11:05:25 · 186 阅读 · 1 评论 -
数据结构之图的创建与遍历---(韩顺平数据结构)笔记
DFS深度优先遍历原创 2022-02-21 10:44:13 · 601 阅读 · 0 评论 -
堆排序算法回顾---(韩顺平数据结构)笔记
堆排序调整,然而每次都需要交换,将最大放在末尾,并每次调整,每次遍历都length-1原创 2022-02-21 09:25:23 · 169 阅读 · 0 评论 -
克鲁斯卡尔算法---(韩顺平数据结构)笔记
package kruskal;import java.util.Arrays;public class KruskalCase { private int edgeNum; //边的个数 private char[] vertexs; //顶点数组 private int[][] matrix; //邻接矩阵 //使用 INF 表示两个顶点不能连通 private static final int INF = Integer.MAX_VALUE; public static voi原创 2022-02-21 09:21:17 · 278 阅读 · 0 评论 -
普利姆算法(prim)---(韩顺平数据结构)笔记
求出从某一结点开始到达其他结点距离花费最少的组合原创 2022-02-20 12:31:54 · 176 阅读 · 0 评论 -
佛洛伊德算法---(韩顺平数据结构)笔记
用于计算图中各个顶点之间的最短路径原创 2022-02-20 11:51:48 · 457 阅读 · 0 评论 -
贪心算法(java)---(韩顺平数据结构)笔记
贪心算法在对问题进行求解的时候,在每一步选择中都采用最好或者最优的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果不一定是最优的结果,但是都是相对近似的最优解结果最佳应用-集合覆盖假设存在如下表的需要付费的广播台,以及广播台信号覆盖的地区,如何选择最少的广播台,让所有的地区都可以接收到信号使用贪婪算法遍历所有的广播台,找到讴歌覆盖了最多未覆盖的地区的电台,(此电台可能包含一些未覆盖的地区)将这个电台加入到一个集合中,把这些电台覆盖的地区在下一次比较原创 2022-02-16 12:04:10 · 556 阅读 · 2 评论 -
KMP算法解析---(韩顺平数据结构)笔记
字符串的匹配(暴力匹配)// 暴力匹配 public static int volienceP(String str1,String str2){ char[] c1 = str1.toCharArray(); char[] c2 = str2.toCharArray(); int i = 0; int j = 0 ; while (i < str1.length() && j < str2.length()){ if(c1[i] == c2[j]原创 2022-02-15 10:36:33 · 476 阅读 · 0 评论 -
动态规划(背包问题)---(韩顺平数据结构)笔记
动态规划算法-背包问题思路分析算法的主要思想,利用动态规划来解决,每次遍历到的第I个物品,根据W[i]和v[i]来确定是否需要将该物品放入背包中,即对给定的第n个物品,设v[i] w[i]分别为第i个物品的价值和重量 C为背包的容量,再令v[i][j]为 在第i个物品能够装入j容量背包的最大价值算法步骤:v[i][0] = 0 v[0][i] = 0;当w[i] > j 时 v[i][j] = v[i-1][j] // 当准备加入新增的商品的容量当 j>=w[i] 时 v[i.原创 2022-02-15 09:19:41 · 424 阅读 · 4 评论 -
快速排序算法回顾---(韩顺平数据结构)笔记
public static void sort(int[] arr, int left, int right) { // 定义左下标 int l = left; // 定义右下标 int r = right; // 定义中轴 int pivot = arr[(left + right) / 2]; // 定义临时变量 int temp = 0; // 当左下标 .原创 2022-02-12 10:37:29 · 557 阅读 · 2 评论 -
分治算法-汉诺塔的实现
介绍汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。算法思想1) 如果只有一个盘子 A -> C2) 如果我们有n >= 2 情况,我们总是可以看做是两个盘,1.最下边的盘,2. 上面的盘先把最上面的盘 A ->B把最下面的原创 2022-01-16 11:32:45 · 78 阅读 · 2 评论 -
插值算法回顾
算法简介原创 2022-01-03 08:31:16 · 306 阅读 · 1 评论 -
选择排序算法回顾
选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。原创 2021-12-29 13:31:51 · 510 阅读 · 0 评论 -
希尔排序算法回顾
希尔排序简介希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。时间复杂度和空间复杂度希尔排序时间复杂度是 O(n^(1.3-2)),空间复杂度为常数阶 O(1))。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,原创 2021-12-28 16:22:54 · 108 阅读 · 1 评论 -
插入排序知识点回顾
插入排序(直接插入排序)介绍对于少量元素的排序,它是一个有效的算法,插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的。记录增加1的有序表,在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素有序表进行待插入位置查找,并进行移动插入排序的平均时间复杂度也是 O(n^2),空间复杂度为常数阶 O(1),具体时间复杂度和数组的有序性也是有关联的。插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比原创 2021-12-27 09:31:21 · 152 阅读 · 1 评论 -
java实现获取字符串中出现次数最多的字符并记录下来
// 获取字符串 出现次数最多的字符 public static HashMap<String,Integer> but(String tar) { String[] split = tar.split(""); HashMap<String,Integer> hashMap = new HashMap<String, Integer>(); hashMap.put(split[0], 1); for (int i = 1; i < split.原创 2021-10-12 21:56:28 · 636 阅读 · 1 评论 -
记录-螺旋数组
package Day3;public class SpiralMatrix { public static void main(String[] args) { int[][] spiral_array = Spiral_array(3); for (int i = 0; i < spiral_array.length; i++) { for (int j = 0; j < spiral_array.length; j++) { System.out.printf原创 2021-10-12 16:01:01 · 57 阅读 · 1 评论 -
排序算法笔记
冒泡排序时间复杂度O(n^2)public void bubble_sort(int [] arr) { int tmp = 0; // 标识,用作判断 是否发生了交换 boolean flag = false; for(int i = 0;i < arr.length - 1;i++) { for(int j =0 ;j< arr.length - 1 - i ;j++) { // 比较相邻的两个数字 如果大就会交换 if(arr[j] >原创 2021-10-08 19:26:28 · 48 阅读 · 0 评论 -
斐波那契数列(java版)
// 斐波那契列 public static int fac(int n) { if (n == 1) { return 1; } if (n == 2) { return 1; } return fac(n - 1) + fac(n - 2); } // 打印数列 public static void Printfac(int n) { for (int i = 1; i <= n; i++) { System.out.printf("原创 2021-10-05 10:57:12 · 66 阅读 · 0 评论 -
回文串的判定(java版)
public static boolean huiwen(String data) { int len = data.length(); for (int i = 0; i < len / 2; i++) { if(data.charAt(i) != data.charAt(len - i -1)) { return false; } } return true; }测试boolean huiwen = P1.huiwen("121q*1121");原创 2021-10-05 10:52:32 · 121 阅读 · 0 评论 -
HashMap扩容机制解读
扩容机制什么时候需要扩容:当hashmap中的元素个数超过数组大小 * loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75这是一个折中的取值,也就是说,默认情况下数组大小为16,那么当hashmap中的元素个数超过16*0.75 = 12 (阈值或者边界值的时候)就把数组的大小扩展Wie2 * 16 = 32,然后重新计算出每个元素在数组中的位置,而这是一个非常耗性能的操作,所以我们最好能够提前预知并设置元素的个数。注原创 2021-04-25 18:59:42 · 7057 阅读 · 1 评论 -
pta6-1 快速排序
给一个无序表,使用快速排序算法对它进行排序。函数接口定义:int Partition(SqList &L,int low,int high);void QuickSort(SqList &L, int low, int high);其中L是待排序表,low和high是排序的区间。裁判测试程序样例:#include <iostream>using names...原创 2019-12-16 20:54:08 · 4677 阅读 · 1 评论 -
酒店管理系统
代码如下:#include<bits/stdc++.h> #include<conio.h>#include <windows.h>#include<string.h>#include<time.h> #define NUM 1000 //控制房间个数int j;void LoginRoom();//登记房屋void S...原创 2020-01-09 17:50:57 · 1461 阅读 · 7 评论 -
地址赋值行列矩阵转置
利用地址传参转置矩阵众所周知简单的数值矩阵转换已经不算是什么难题了,今天就用地址指针,地址赋值转换矩阵代码如下:#include <stdio.h>#include <stdlib.h>union Node{ struct node1{ int *list[4];//存放转置后的矩阵信息 int data1;//存放数据总和 }nod1; struc...原创 2019-12-08 10:50:59 · 186 阅读 · 0 评论 -
关于树的一些日常操作
1.树的存储结构优点:提高了数据存储,读取的效率, 比如利用 二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同时也 可以保证数据的插入,删除,修改的速度。【示意图,后面详讲】缺点:顺序存储可能会浪费空间(在非完全二叉树的时候),但是读取某个指定的节点的时候效率比较高O(0)链式存储相对二叉树比较大的时候浪费空间较少,但是读取某个指定节点的时候效率偏低O(nlogn)树的相关定义:节点:是数据结构中,bai用来描述“树”du型结构的名词。叶结点或终端结点:度为0的结原创 2020-07-25 19:56:31 · 282 阅读 · 2 评论 -
HashTab的基本用法
哈希表简介:又称为散列表,根据关键码值而直接进行访问的数据结构,也就是说,它通过吧关键码值映射到表中一个位置俩访问记录,以加快查找的速度,这个映射函数就叫做散列函数,存放记录的数组叫做散列表。例题:需将员工的信息按照哈希表的存储方式进行存储需求分析:在保证效率的前提下不适用 数据库 借助第三方工具哈希表是最有效的方式:大致结构如下:(数组+链表)代码如下:package HashTabDemo;import java.util.Scanner;public class HashTa原创 2020-07-25 12:37:43 · 1839 阅读 · 0 评论 -
数据结构之三种存储方式分析
数组存储优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低如图所示:链式存储优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始树存储优点:提高了数据存储,读取的效率, 比如利用 二叉排序树(Binary Sort Tree),既可以保证数据的检索速原创 2020-07-22 22:24:26 · 1608 阅读 · 0 评论 -
查找算法熟练掌握
查找算法(四种)顺序查找二分查找插值查找斐波那契查找1.顺序查找(线性查找)思路:按照一定的顺序从始至终查找要找的数字算法实现package Serach;public class SeqSearch {public static void main(String[] args) { int arr[] = {1,2,3,4,5,65}; int index = seqSearch(arr, 1); if(index == -1) { System.out.prin原创 2020-07-22 22:05:20 · 180 阅读 · 0 评论 -
数据结构之排序算法(学习笔记及总结)
一、介绍排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。二、 排序的分类:内部排序指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。常见的排序算法分类(见下图):三、 算法的时间复杂度度量一个程序(算法)执行时间的两种方法1) 事后统计的方法这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所 得时间原创 2020-07-13 18:59:41 · 475 阅读 · 0 评论