数据结构与算法
花泽生菜.
努力拱白菜
展开
-
蓝桥杯常用算法模板---基础篇
写在前面:距离蓝桥杯省赛还有不到半月,个人整理一些常用算法,分享给大家。最小公倍数gcd、最大公约数lcmpublic class LeastCommonMultiple { //使用欧几里得算法求解数m和数n最大公约数 public int getGcd(int m,int n){ while(n > 0){ int temp = m % n; m = n; n = temp;原创 2022-03-26 21:05:53 · 2355 阅读 · 1 评论 -
哈希表(解决哈希冲突)
哈希表是一种存储记录的连续内存通过哈希函数的应用,通过哈希函数的应用,可以快速存取与查找数据。所谓哈希法(Hashing),就是将本身的键(Key)通过特定的数学函数运算或使用其他的方转化成对应的数据存储地址。注:哈希法所使用的数学函数称为“哈希函数”(Hashing Function)。另外,Key在不混淆“键值对”时也可称之为键值。先来了解一下有关哈希函数的相关名词·Bucket(桶):哈希表中存储数据的位置,每一个位置对应唯一的地址(Bucket Address)桶就好比存在一个记录的位置原创 2022-03-24 21:19:24 · 919 阅读 · 0 评论 -
洛谷P1115JAVA
题目描述给出一个长度为 nnn 的序列 aaa,选出其中连续且非空的一段使得这段和最大。输入格式第一行是一个整数,表示序列的长度 nnn。第二行有 nnn 个整数,第 iii 个整数表示序列的第 iii 个数字 aia_iai。输出格式输出一行一个整数表示答案。输入输出样例输入 #172 -4 3 -1 2 -4 3输出 #14说明/提示样例 1 解释选取 [3,5][3, 5][3,5] 子段 {3,−1,2}\{3, -1, 2\}{3,原创 2022-02-11 18:14:52 · 521 阅读 · 0 评论 -
斐波那契查找法
import java.util.Arrays;public class FibonacciSearch { public static int maxSize = 20; //斐波那契数列 public static int[] fib() { int[] f = new int[maxSize]; f[0] = 1; f[1] = 1; for (int i = 2; i < maxSize; i++..原创 2022-01-28 15:41:19 · 303 阅读 · 0 评论 -
插值查找法
插值查找法又称为插补查找法,是二分查找法的改进版,按照数据位置的分布,利用公式预测数据所在的位置,再以二分法的方式渐渐逼近。使用插值查找法时,假设数据平均分布在数组中,而每一项数据的差距相当接近或有一定的距离比例。插值查找法的公式为:mid=low+((key-data[low])/(data[high]-data[low]))*(high-low)其中,key是要查找的键值,data[high]、data[low]是剩余待查找记录中的最大值和最小值。假设数据项数为n,其插值查找法的步骤如下:(原创 2022-01-27 21:47:42 · 1004 阅读 · 0 评论 -
八皇后问题Java
思路分析: 把第一个皇后放到第一行第一列(1)把第二个皇后放到第二行第一列,进行判断,如果不行,放在第二列,进行判断,如果不行,放在 第三列,进行判断,一次把所有列进行尝试,直至找到合适位置(2)把第三个皇后放到第三行第一列,同步骤2(3)........(4)直至第8个皇后也能放到合适位置,此时第一个符合要求摆法便找到。(5)当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯。把第一个皇后在第一行第一列...原创 2022-01-26 23:25:04 · 730 阅读 · 0 评论 -
堆排序Java实现
堆排序法是选择排序法的改进版,可以减少在选择排序法中的比较次数,进而减少排序时间。堆排序法用到了二叉树的技巧,是利用堆排序来完成排序的。堆积树是一种特殊的二叉树,可分为最大堆积树和最小堆积树两种最大堆积树满足以下3个条件:1、它是一颗完全二叉树2、所有的节点的值都大于或等于它左、右节点的值3、树根是堆积树中最大的。最小堆积树满足以下3个条件1、它是一颗完全二叉树2、所有节点的值都小于或等于它左、右子节点的值3、树根是堆积树中最小的原理实现图:代码实现:.原创 2022-01-25 21:35:03 · 247 阅读 · 1 评论 -
用链表来实现二叉树
二叉树最多只能有两个子节点,也就是说分支度小于或等于2.所谓二叉树的链表表示法,就是利用链表来存储二叉树。使用链表来表示二叉树的好处是节点的增加与删除操作相对容易,缺点是很难找到父节点,除非在每一节点多增加一个指向父字段。代码实现:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * @author admin $ * @title $ *原创 2022-01-24 13:26:39 · 1231 阅读 · 0 评论 -
用数组来创建二叉树
首先来看看使用一维数组建立二叉树的表示方法以及数组索引的设置从图中可以看出次一维数组中的索引值有以下关系 :* 左子树索引值是父节点索引值乘以二* 右子树索引值是父节点索引值乘以二加一接着看一下如何以一维数组建立二叉树,实际上就是建立一棵二叉查找树。这是一种很好地排序应用模式,因为建立二叉树的同时数据就经过了初步的比较判断,并按照二叉树的建立规则来存放数据。二叉查找树具有以下特点:(1)可以是空集合,若不是空集合,则节点上一定要有一个键值。(2)每一个树根的值需大于左子树的值原创 2022-01-24 12:37:59 · 4698 阅读 · 2 评论 -
快速排序和归并排序(JAVA)
快速排序是有C.A.R.Hoare提出来的。快速排序又称为分割交换排序法,是目前公认最佳的排序法,也是使用“分而治之”的方式,会在数据中找到一个虚拟的中间值称为基准,并按此基准将所有打算排序的数据分为两部分。其中小于基准的数据放在左边,而大于基准的数据方在右边,再以同样的方式分别处理左、右两边的数据,直到排序完成为止。算法分析:(1)在最好情况和平均情况下,时间复杂度为O(n);在最坏情况下(每次挑选中间值不是最大就是最小)下,其时间发复杂度为O()。(2)快速排序不是稳定排序算法。(3)在原创 2022-01-24 02:32:18 · 168 阅读 · 0 评论 -
希尔排序JAVA实现
实现原理动态图解:import java.util.Arrays;public class ShellSort { public static void shellSortSmallToBig(int[] data) { int j = 0; int temp = 0; int jmp=data.length/2; for ( jmp = data.length / 2; jmp > 0; jmp /= 2) {原创 2022-01-22 19:34:54 · 257 阅读 · 0 评论 -
选择排序和插入排序(JAVA)
选择排序:算法分析:(1)无论是最坏情况、最好情况和平均情况都需要找到最大值(或最小值),因此其比较次数为(n-1)+(n-2)+(n-3)+...+2+1=n(n+1)/2次;时间复杂度为O()(2)由于选择排序是以最大值或者最小值直接与最前方未排序的键值交换,数据排列顺序很有可能被改变,因此它不是稳定排序(3)因为需要一个额外的空间,所以空间复杂度为最佳(3)比较适用于数据量小或者由部分数据已经排过序的情况实现原理动态图:/** * @author admin $ *原创 2022-01-21 22:43:27 · 391 阅读 · 0 评论 -
冒泡排序法
前言:本篇参考《图解算法》冒泡排序法又称为交换排序法,是从观察水中气泡变化构思而成的,原理是从第一个元素开始,比较相邻元素大小,若大小顺序有误,则对调后再进行下一个元素的比较,就仿佛气泡从水底开始逐渐升到水面一样。如此通过扫描一次之后就可以确保最后一个元素位于正确的顺序。接着进行第二次扫描,直到完成所有元素的排序为止。动态效果图:/** * @author admin $ * @title * 冒泡排序 * @description $ * @updateTime $ 20.原创 2022-01-21 21:08:49 · 405 阅读 · 0 评论 -
数据结构-链表学习java实现
1、链表初识(类型固定 容量固定)·链表是线性表中常见的两种表现方式之一·数据储存在节点(Node)中·Node一般来说包括:元素、前驱、后继·第一个节点的前驱是Null,最后一个节点的后继是Null·真正的实现了动态,不需要考虑动态扩容问题·查找困难·引用(C中的指针) 非常考验对引用的理解·几点可以使用内部类来实现2、节点实现(内部类)public class LinkedList<E> { private class Node{ /原创 2022-01-19 12:43:02 · 395 阅读 · 0 评论 -
力扣:完成一半题目
有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。示例 1: 输入:questions = [2,1,6,2] 输出:1 解释:有 2 位扣友在 4 道题目中选择 2 题。 可选择完成知识点类型为 2 的题目时,此时仅一种知识点类型 因此至少包含 1 种知识点类型。.原创 2022-01-18 02:40:42 · 179 阅读 · 0 评论 -
两个栈实现一个队列
今天逛论坛的时候偶然间看到了这个题,本人又菜又爱玩,算是个初学者 之前没咋逛过论坛 博客也是近期开始写的。刚看到这个问题些许的懵比,后来仔细一想 真NM简单 还以为啥高大上的题目,好了好了言归正传。首先我们明确一下 栈和队列的特性。栈:先进后出 队列:先进先出 两者的实现方式都是数组、链表思考: 将一组数1、2、3分别存入栈和队列中,出栈3、2、1;出队列1、2、3;这里我们使用两个栈 假设栈a 实现 出栈 3、2、1 然后进入栈b 出栈实现1、2、3,即栈a栈b 实现了一个队列。/.原创 2022-01-14 20:47:49 · 161 阅读 · 0 评论