算法(Java 牛客网)
文章平均质量分 57
算法的五个基本特性分别是:输入、输出、有穷性、确定性和可行性,但这些定义都不重要,重要的是,能学会算法中的优秀思想,会运用算法思想解决实际的问题
云疏不知数
一个人知道自己为了什么而活,他就能够忍受任何一种生活----尼采
展开
-
16.转圈打印矩阵
转圈打印矩阵123567910111234567891011121314151612345678910111213141516171819202122232425边界法循环什么时候结束需要看打印的元素个数是否是矩阵的个数import java.util.*;public cl.原创 2021-05-12 17:31:27 · 251 阅读 · 1 评论 -
15.队列和栈热点题目
数组实现栈package yzy.algorithm;public class arryStack { private int[] arr; private int index; public arryStack(int initialSize){ if(initialSize < 0){ throw new IllegalArgumentException("The initial Size is less than 0!");.原创 2021-04-11 15:20:08 · 85 阅读 · 0 评论 -
14.桶排
桶排计数排序是桶排的一种具体实现给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序很精彩的解题思路:不使用桶排,但是借助桶。N个数,就准备N+1个桶,遍历一遍找到最小值和最大值。如果最大值和最小值相等,最大差值就是0;如果最大值和最小值不等,则最小值放到0号桶,最大值放到n号桶,将最大值和最小值的范围等分成N+1份,中间N-2个数属于哪个范围就放到哪个桶里。排序完成相邻两数可能来自同一个桶,也可能来自不同桶。根据鸽笼原理,N个数N+1个桶,第.原创 2021-04-11 15:18:37 · 130 阅读 · 0 评论 -
13.排序的稳定性总结以及比较器
稳定性的定义假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。排序的稳定性意义在多元信息组中,按照某一关键字排序,又不会导致其它信息顺序改变。比如个人信息按年龄排序,又要求相同年龄的人信息的先后顺序保持之前的顺序,便需要使用稳定性的排序方法各排序稳定性总结图中圈起来的6种排序都是基于比较的排序综合排序综合排序可能是快排.原创 2021-03-15 11:31:18 · 224 阅读 · 0 评论 -
12.实时获取中位数
从一个持续输出数字的流实时获取中位数思路:一个大根堆一个小根堆,依次插入数字,如果小于等于大根堆堆顶就插入大根堆,大于大根堆堆顶就放入小根堆,确保它们的元素个数相差不大于1,如果两个堆元素个数相差大于1,就将多的那个堆元素弹出堆顶放入另一个堆中。大根堆堆顶是值大的N/2个元素中的最大值,小根堆堆顶是值小的N/2个元素中的最小值,因此很容易在任何时候得出中位数是多少。将数字依次存入大根和小根堆时间复杂度只有树层高度的复杂度O(logN)这个思路的重点在于大小堆的元素个数相差不大于1,一旦不满足就要调整,.原创 2021-03-14 11:21:53 · 1221 阅读 · 0 评论 -
11.堆排序
堆排序就是完全二叉树 1以数组形式表示二叉树下标i的左孩子是2i+1,右孩子是2i+2,一个节点的父节点是(i-1)/2大根堆在这棵完全二叉树中任何一棵子树的最大值是头部建立大根堆给一个数组:2 1 3 6 0 4我们首先人为规定这棵树只有一个节点2,依次增加一个节点并调整为大堆过程如下:演示过程使用graphviz,一个图一份源码1from graphviz import Digraphdot = Digraph(comment='The Round Table')dot.n..原创 2021-03-06 10:02:21 · 2559 阅读 · 8 评论 -
10.经典快排和快排加速
随机快速排序的细节和复杂度分析可以用荷兰国旗问题来改进快速排序,时间复杂度0(N*logN),额外空间复杂度O(logN)经典快排从数列中挑出一个元素作为基准,比如将一个数组的最后一个元素x作为基准,将小于等于x的元素移动到数组前部分,将大于x的元素移动到数组后部分,分治的思想继续将上一次的小于等于x和大于x的两块再次重复以上排序步骤,最终部分有序从而整体有序。函数minuteArray将数组[l,r]区间上的元素以num为基准分成大于和小于num的前后两部分,返回值x是小于区域的最后一个元素下标.原创 2021-03-03 16:04:02 · 507 阅读 · 3 评论 -
9.荷兰国旗
问题一给定一个数组arr,和一个数num,请把小于等于num的数放在数 组的左边,大于num的数放在数组的右边。要求额外空间复杂度0(1),时间复杂度0(N)给定一个小于等于区域,遍历,如果当前数小于等于num,则当前数和小于等于把区域紧挨着的下一个位置数字交换,小于等于区域顺序扩张一个数;如果当前数大于num,则继续遍历代码如下:package yzy.algorithm;public class dutchFlag { //给定一个数组arr,和一个数num,请把小于等于num.原创 2021-03-03 14:46:36 · 479 阅读 · 1 评论 -
8.小和问题
小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。例子:[1,3,4,2,5]1左边比1小的数,没有;3左边比3小的数,1;4左边比4小的数,1、3;2左边比2小的数,1;5左边比5小的数,1、3、4、2;所以小和为1+1+3+1+1+3+4+2=16递归方式归并排序中,总能递归到最小元组,那么我们可以想到,求左边比右边小的数字和,就是求左边每个比较小的数字与右边比它大的数字个数的乘积和。(比较小的含义是它的右边存在比它大的任意的数)我..原创 2021-03-03 11:10:43 · 1183 阅读 · 4 评论 -
7.归并排序
归并排序时间复杂度O(N*logN),额外空间复杂度O(N)具体实现过程请观看算法(c语言版)之归并排序package yzy.algorithm;public class testMergeSort { public static void mergeSort(int[] arr) { if(arr == null || arr.length<2) return...原创 2020-02-10 18:56:01 · 177 阅读 · 0 评论 -
6.迭代与master公式
利用master公式求时间复杂度求递归行为的时间复杂度 master公式的式子: T(N) = a*T(N/b)+O(n^d) N: 样本量 N/b: 子过程样本量 a: 子过程执行次数 O(n^d): 除了子过程之外的执行过程:比如比较 第一步先看递归行为是不是满足master公式: T(N) = a*T(N/b)+O(n^d) 的形式,并求出式子中各个常数在下面例子中:...原创 2020-02-10 18:38:29 · 203 阅读 · 0 评论 -
5.对数器验证冒泡排序法改进
相较于为了对对数器的探究,上一篇对数器中的isEqual和copyArray方法使用了Array.equal()和System.copyArray()库方法代替,以简化代码和提升美观性package yzy.algorithm;import java.util.Arrays;/* * 测试对数器改进之 * 去除isEqual和copyArray方法 * 用Array.equal...原创 2020-02-10 08:44:56 · 191 阅读 · 0 评论 -
4.对数器
有时候做算法题可能无法短时间内,或者很难推导出正确的数学式子(比如贪心算法),来验证自己算法的正确,这时候就需要大量的随机样本进行测试验证。对数器能够产生大量的随机数据对数器的实现要素1 比如你要测试冒泡排序bubbleSort方法的正确性1,实现一个绝对正确的但是时间或空间复杂度不好的方法比如库函数sort2,实现一个随机样本产生器3,实现比对的方法4,把方法bubbleSort...原创 2020-02-10 08:40:21 · 216 阅读 · 0 评论 -
3.插入排序
冒泡排序的具体实现过程请观看算法(c语言版)之直接插入排序(插入排序)牛客老师做法 public static void insertSort(int[] arr) { if(arr == null || arr.length < 2) { return; } for(int i=1; i<arr.length; ++i) { for(int j=i-1...原创 2020-02-09 20:24:28 · 201 阅读 · 0 评论 -
2.选择排序
选择排序的时间复杂度是O(N^2)额外空间复杂度O(1)具体实现过程请观看算法(c语言版)之选择排序牛客老师做法 public static void SelectSort(int[] arr) { if(arr == null || arr.length < 2) { return; } for(int i=0; i<arr.length; ++i) {...原创 2020-02-09 21:00:22 · 148 阅读 · 0 评论 -
1.冒泡排序
冒泡排序的具体实现过程请观看C语言版的数据结构之冒泡排序博文,思想都是一样的排序的时间复杂度是O(N^2)额外空间复杂度O(1) 文末附完整代码和随机数生成的三种方式牛客老师做法static void bubbleSort(int[] arr) { for(int i = arr.length-1; i>0; --i) { for(int j = 0; j<i; ...原创 2020-02-09 21:25:17 · 189 阅读 · 0 评论