![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
北漂小白
这个作者很懒,什么都没留下…
展开
-
用一个栈实现另一个栈的排序
用一个栈实现另一个栈的排序一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排列,只需申请一个栈,除此之外,可以申请新的变量,但不能申请额外的数据结构,如何完成排序?思路:先将有数据的栈中的数据在辅助栈中从顶到底按从小到大的顺序排序,实现方法:数据栈中的元素依次出栈,如果辅助栈不为空,每个出栈的元素都和辅助栈栈顶的元素做比较,如果栈顶的元素小,那么就将辅助栈的元素出栈并加入到数据栈,直到栈顶的元素较大时停止,然后将元素入栈,一直循环,直到数据栈为空停止,然后将辅助栈中的元素再依次加入到数据原创 2021-03-24 22:38:21 · 218 阅读 · 1 评论 -
由两个栈组成的队列
由两个栈组成的队列编写一个类,用两个栈实现队列,支持队列的操作(add,poll,peek)栈是先进后出的,而队列为先进先出的,我们可以先将数据加入到一个栈中,然后再将数据倒入另一个栈,这样正好就可以实现先进先出,例如:数据进Push栈的顺序为1,2,3,4,5,出Push栈的顺序为5,4,3,2,1,然后进入Pop栈顺序为5,4,3,2,1,出Pop栈的顺序为1,2,3,4,5,正好符合队列的性质。不理解的话,画个图就清楚啦。此题就是考察了对栈和队列的理解。有两个容易出错的地方:等Pop栈中没有原创 2021-03-24 21:57:35 · 115 阅读 · 0 评论 -
设计一个有getMin功能的栈
设计一个有getMin功能的栈要求:pop、push、getMin操作的时间复杂度都是O(1)设计的栈可以使用现成的栈结构本题其实就是要设计一个方法,可以随时查找到栈中的最小值,可以使用两个栈来解决这个问题,一个栈用来保存数据,另一个栈用来保存最小值。具体思路:有一个数据date入栈时,先将date压入date栈,然后判断min栈是否有数据,如果没有数据直接将date压入min栈。如果min栈中有数据,那么查看栈顶的数据,如果大于或者等于date,将date压入min栈;如果小于date原创 2021-03-24 21:20:59 · 77 阅读 · 0 评论 -
相邻两数的最大差值
给定一个数组,求如果在排序之后,相邻两数的最大差值,要求时间复杂度O(n),且不能使用非基于比较的排序(也就是不能使用基数排序)解题思路: 本题最简单最暴力的解法就是使用Arrays.sort(),然后遍历一遍就可以找到相邻两数的最大差值,但是要求时间复杂度为O(n),此方法就行不通了;还有一种方法就是采用桶排序。遍历一遍数组,找到最大值和最小值。将数组中数的范围按照数组长度 + 1进行等分,即(max - min) / (array.length + 1),划分到length + 1个桶中。原创 2021-03-23 21:08:11 · 778 阅读 · 2 评论 -
逆序对问题
逆序对问题描述在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对,请打印所有逆序对.逆序对问题使用归并排序的思想,在合并的时候,如果左边指针p1指向的数比右边指针p2指向的数要大,那么p1到中间位置的所有数都会比p2指针指向的数要大,这些都会是逆序对。public class Reverse { public static void reverse(int[] arr){ if(arr == null || arr.length < 2){原创 2021-03-17 22:49:18 · 178 阅读 · 0 评论 -
小和问题
小和问题描述在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。例子[1,3,4,2,5]1左边比1小的数:没有3左边比3小的数:14左边比4小的数:1,32左边比2小的数:15左边比5小的数:1,3,4,2小和为1+1+3+1+1+3+4+2=16最简单的方法是用两层for循环,当前值比他之前的值大,就当之前的值累加,这样最后就可以计算出小和,时间复杂度为O(n^2),但是这样解效率太差,所以不推荐这种解法。还可以使用分治来解这道题,引用官方的话来原创 2021-03-17 22:20:28 · 154 阅读 · 0 评论 -
寻找两个有序且不重复数组A,B中重复的部分
寻找两个有序且不重复数组A,B中重复的部分本题有三种解法,代码如下:/** * 寻找两个有序且不重复的数组A,B中重复的部分 */public class TwoArrayCommon { /** * 解法1: * 最暴力的方法解决,也是效率最差的方法,不推荐 * 用一个for循环里面嵌套一个for循环,然后第一层for循环遍历一个数组,第二层for循环遍历另一个数组,遇到重复的元素时就将该元素加入到List集合中。 * @param A 数组A原创 2021-03-17 21:15:03 · 324 阅读 · 0 评论 -
排序算法之堆排序
堆排序堆排序是指利用堆这种数据结构设计的一种排序算法,堆分为大顶堆和小顶堆,他是一个近似完全二叉树的结构。大顶堆每个节点的值都大于或者等于它的左右节点的值。小顶堆每个节点的值都小于或者等于它的左右节点的值。性质大顶堆:arr[i] >=arr[i * 2 + 1],arr[i] >= arr[i * 2 + 2]小顶堆:arr[i] <= arr[i * 2 + 1],arr[i] <= arr[i * 2 + 2]堆排序的步骤:建堆将堆首和堆尾交换将原创 2021-03-16 22:07:05 · 98 阅读 · 0 评论 -
排序算法之冒泡排序
冒泡排序冒泡排序是十大常见排序的算法之一,冒泡排序顾名思义就像是水中气泡一样,小的数会慢慢的冒出来,而大的数会慢慢的沉下去。如果有十个数,那么需要比较九躺,而每次都会比较出相对较大的一个数,放在下边,每趟可以比上一趟少比较一次。举个栗子:下面是冒泡排序的代码:public class BubbleSort { public static void bubbleSort(int[] arr){ if(arr ==null || arr.length < 2){原创 2021-03-16 21:04:08 · 74 阅读 · 0 评论 -
排序算法之插入排序
插入排序插入排序是十大常用排序算法之一,一般也被称为直接插入排序,他的基本思想是将一个记录插入到已经排好序的有序数组中,从而生成一个记录数加一的有序数组。插入排序的平均时间复杂度为O(n^2),空间复杂度为O(1)例子:下边是插入排序的代码:public class InsertSort { public static void insertSort(int[] arr){ if(arr == null || arr.length < 2){原创 2021-03-16 21:03:16 · 128 阅读 · 0 评论 -
排序算法之选择排序
选择排序选择排序是一种简单又直观的排序算法,他第一次会从头扫描至尾,然后找到一个最小或者最大的数,和第一个元素交换,然后,再从剩下的元素中找到最小或者最大的数,和第二个元素交换,依次类推,每次有序数列的长度就会加一,直到数组中的前边N-1个数全部排列好后,该数组也就有序了。例子:下面是选择排序的代码:public class SelectSort { public static void selectSort(int[] arr){ if(arr == null || a原创 2021-03-16 21:01:55 · 87 阅读 · 0 评论