
数据结构和算法
文章平均质量分 92
unwrapping
不积硅步,无以至千里
展开
-
求环形单链表环长和环入口(java)
本篇的两个问题由上一篇判断单链表是否有环(java)引申而出。求环长思路分析快慢指针第一次相遇表示链表有环快慢指针从第一次相遇开始到第二次相遇,期间慢指针走的步数即为环长代码实现public static int cycleLength(ListNode head) { ListNode slow = head; ListNode fast = head; int cycleLength = 0; // 标识快慢指针第一次相遇原创 2020-10-24 15:00:28 · 293 阅读 · 0 评论 -
判断单链表是否有环(java)
图示思路分析代码实现原创 2020-10-24 00:39:07 · 2077 阅读 · 2 评论 -
回文单链表(java)
如何判断一个单链表是回文单链表?LeetCode题目链接下面是LeetCode的题目截图:思路分析回文单链表:链表反转后和原链表一样思路一:根据回文单链表的特点很容易分析出① 反转单链表② 遍历比较原链表和反转后的链表,如果有不一样的结点,说明不是回文的,如果两链表完全一样,说明是回文的思路二:① 使用快慢指针找出链表的中间结点,其中快指针步长为2,慢指针步长为1② 根据中间结点反转后半部分链表③ 遍历比较前后两部分链表的结点是否一致反转实现由于两个思路都需要反转,这里先原创 2020-10-15 13:07:18 · 1205 阅读 · 6 评论 -
java实现插值查找
什么是插值查找插值查找,有序表的一种查找方式。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。插值类似于平常查英文字典的方法,在查一个以字母C开头的英文单词时,决不会用二分查找,从字典的中间一页开始,因为知道它的大概位置是在字典的较前面的部分,因此可以从前面的某处查起,这就是插值查找的基本思想。插值查找除要求查找表是顺序存储的有序表外,还要求数据元素的关键字在查找表中均匀分布,这样,就可以按比例插值。思路分析插值查找的实现和二分查找基本一致,唯一的区别就是查找点下标的选择原创 2020-10-12 21:07:50 · 338 阅读 · 0 评论 -
java实现二分查找算法
什么是二分查找二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。基本思想是:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。图原创 2020-10-08 23:31:44 · 490 阅读 · 0 评论 -
java实现快速排序
什么是快速排序快速排序(Quicksort)使用分治思想对冒泡排序作了改进,效率非常高。其基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序的实现从快速排序的基本思想可以分析出其实现思路:一、选取一个枢轴元素(也叫基准元素)二、将数组分割成两部分,一部分数据都小于或等于枢轴元素,另一部分数据都大于枢轴元素三、对分割的子数原创 2020-10-07 15:43:18 · 4611 阅读 · 3 评论 -
java实现归并排序
一、什么是归并排序归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。什么是分治法?1)在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。2)分治法的精髓:**分解:**将原问题分解为若干个规模较小,相互独立,与原问题形式相原创 2020-10-02 22:05:14 · 207 阅读 · 0 评论 -
java实现希尔排序
一、基本介绍希尔排序(Shell’s Sort)是插入排序的一种,又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是把待排序序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的元素越来越多,当增量减至 1 时,整个序列恰被分成一组,排序完成。二、由来希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由希尔 1959 年公布。希尔排序是基于插入排序的以下两点性质而提出改原创 2020-09-21 22:29:33 · 498 阅读 · 0 评论 -
java实现插入排序
概述插入排序(Insertion Sorting)的基本思想是把待排序序列分为有序序列和无序序列两部分,从无序序列中获取第一个元素按照指定规则(从小到大或从大到小)插入到有序序列的合适位置,依次类推,直到无序序列中的元素个数为0,最终形成一个有序序列。一般情况下,初始状态时,我们把第一个元素作为有序序列,剩余的作为无序序列。图解代码实现public static void insertSort(int[] arr) { for (int i = 1; i < arr.len原创 2020-09-20 15:21:04 · 290 阅读 · 0 评论 -
java实现选择排序
概述选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。图解代码实现public static void selectSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { // 需要原创 2020-09-20 01:25:12 · 321 阅读 · 0 评论 -
java实现冒泡排序
冒泡排序概述冒泡排序(Bubble Sorting) 的基本思想就是通过对待排序序列从前向后,依次比较相邻元素的值,如果出现逆序则交换。如果是从小到大排序,则每一轮冒泡就能将序列的最大值交换到序列的尾部,从而确定下来。图解分析分析:1)假定待排序序列是数组arr。2)要让数组元素变得完全有序,我们需要完成arr.length-1轮冒泡。例如,数组长度为6,要完成6-1=5轮冒泡。3)每轮冒泡要比较的次数为arr.length-1-i,其中i表示第i轮冒泡,编程时从0开始。例如,第0轮原创 2020-09-19 05:33:30 · 299 阅读 · 0 评论 -
java实现单链表的反转
一、遍历反转核心思路:遍历原链表,从原链表的头部一个一个取节点并插入到新链表的头部图示定义一个新的变量newHead,表示新链表的头结点遍历原链表,每次取出原链表的第一个结点,然后将它加入新链表的头部最后将head.next指向newHead.next代码实现public void reserve() { // 如果链表为空,或者只有一个结点,则不反转 if (head.next == null || head.next.next == null) {原创 2020-09-15 23:18:37 · 546 阅读 · 0 评论 -
java实现单链表的建立(头插法和尾插法)
单链表单链表(Single Linked List):单链表是一种链式存取的数据结构,用一组地址任意(可能连续,也可能不连续)的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:data域–存放结点值的数据域next域–存放结点的直接后继的地址的指针域(链域)链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的单链表的每个结点只有一个next域头指针head:单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针h原创 2020-09-14 16:04:02 · 8708 阅读 · 4 评论 -
java数组实现环形队列
分析图解代码实现public class CircleArrayQueueDemo { public static void main(String[] args) { CircleArrayQueue queue = new CircleArrayQueue(3); try (Scanner scanner = new Scanner(System.in)) { String operation; A:原创 2020-09-12 17:23:31 · 168 阅读 · 0 评论 -
稀疏数组与二维数组相互转换
稀疏数组稀疏数组其实本质还是个二维数组,只不过它有以下特性:1)普通存储方式列固定为三列,第一行存储原始数据总行数,总列数,总的非0数据个数,接下来每一行都存储非0数所在行,所在列,和具体值2)数据紧凑,节省存储空间java代码实现稀疏数组与二维数组相互转换public class SparseArray { public static void main(String[] args) { // 初始化一个5行6列的二维数组 int row = 5;原创 2020-09-09 16:57:51 · 150 阅读 · 0 评论 -
时间复杂度和空间复杂度
1 概述1)如何衡量一个算法(或一段程序)的性能?通常我们通过该算法耗时长短以及耗费空间大小去衡量它的性能2)那么如何确定算法的耗时长短以及耗费空间的大小呢?a) 耗时长短:通常我们可以运行该算法程序,根据其运行时间的长短确定耗时,耗时少则性能好,但是由于不同计算机的cpu计算能力不同(当然还有其他很多因素,比如cpu时间片占用导致我们的算法等待),所以用这种算法也是不能准确计算出算法的耗时长短的,而且还有一个局限性就是采用这种计算耗时的方法必须是写完算法之后;所以为了在设计算法之前就对算法耗时能有原创 2020-09-09 15:01:01 · 613 阅读 · 0 评论 -
数据结构和算法(一) 基础概念
程序 = 数据结构 + 算法1、数据结构1.1 定义相互之间存在一种或多种特定关系的数据元素的集合。按某种逻辑关系组织起来的一批数据(或称带结构的数据元素的集合)应用计算机语言并按一定的存储表示方式把它们存储在计算机的存储器中,并在其上定义了一个运算的集合。1.2 分类可以将数据结构分为逻辑结构和物理结构(存储结构)1.2.1 逻辑结构逻辑结构可以分为集合机构、线性结构、树形结构、图形结构集合结构:数据元素同属于一个集合,元素之间无任何关系线性结构:数据元素之间是一对一的相互关系原创 2020-09-07 21:57:58 · 166 阅读 · 0 评论