算法
文章平均质量分 52
醉卧考场君莫笑
菜鸟
展开
-
复制含有随机指针(random)的链表
文章目录前言一、要求是什么?二、区分场景1.用哈希表1.1思路1.2代码2.不用哈希表1.1思路1.2代码总结前言首先得区分笔试于面试,笔试的话就不需要考虑空间复杂度,面试需要考虑空间复杂度一、要求是什么?现有一种链表,它的节点,不仅仅是有next指针,还有random指针。随机指向链表中的一个节点,也可以为空。现在要将这个链表拷贝一份出来二、区分场景1.用哈希表1.1思路很简单,用哈希表就可以非常简单的复制成功哈希表对应的是老节点和新链表的对应节点用老节点查询老链表中的下一个节.原创 2021-11-30 20:01:37 · 401 阅读 · 0 评论 -
将链表中的划分小于,等于,大于一个值(java实现链表Partition)
文章目录前言一、要求是什么?二、情景区分1.笔试1.1 思路1.2代码实现2.面试2.1思路2.2代码实现总结前言在快速排序中,我们都是将数组划分为小于,等于,大于三个部分。那么在链表中怎么划分呢?一、要求是什么?要求用链表实现快速排序的一次过程。也就是一次Partition二、情景区分1.笔试1.1 思路笔试简单,不需要考虑空间复杂度,那太简单了。直接创立一个等同与链表的数组,直接对数组套用一次快速排序就行1.2代码实现//节点定义public static class No.原创 2021-11-29 13:59:16 · 548 阅读 · 0 评论 -
快慢指针判断链表回文结构
文章目录前言一、回文结构是什么?二、方法不断改进1.直接放入栈判断1.1思路1.2代码2.放一半到栈1.1思路1.2代码先改变后一半节点的指向,不用栈1.1思路1.2代码总结前言在面试中碰到这种题,需要考虑空间复杂度一、回文结构是什么?就是一个链表关于中点对称,或者关于中心轴对称二、方法不断改进1.直接放入栈判断1.1思路从头到尾遍历整个链表,将值放入栈中在从头遍历链表,每到一个节点就出栈一个值两个值相等就接着遍历如果不相等就直接返回不是回文结构如果直到栈为空了(或者头节点为.原创 2021-11-27 16:31:41 · 401 阅读 · 0 评论 -
快慢指针(java)
文章目录前言一、快慢指针是什么?二、多种情况奇数一起走慢指针快一步快指针快一步(无意义)快指针快两步偶数一起走慢指针快一步快指针快一步快指针快两步前言快慢指针是链表的一个重要的方法,在面试中常常用来使空间复杂度变小。但是又有很多中情况需要讨论,所以我们所需要做的是不断的练习,否则一旦在面试中卡住就是几个小时,很不爽一、快慢指针是什么?就是用两个指针遍历数组,一个指针一次走两步叫快指针,一个指针一次走一步,叫做慢指针。这样在快指针到尾部的时候,慢指针就到了中点。这样就可以找到链表的中点。二.原创 2021-11-27 15:39:55 · 1017 阅读 · 0 评论 -
面试写链表题方法论
文章目录前言一、方法论是什么?二、重要技巧1.额外数据结构记录(哈希表等)2.快慢指针前言面试和笔试也会考单链表的问题一、方法论是什么?1)对于笔试,不用太在乎空间复杂度,一切为了时间复杂度 2)对于面试,时间复杂度依然放在第一位,但是一定要找到空间最省的方法二、重要技巧1.额外数据结构记录(哈希表等)2.快慢指针...原创 2021-11-25 00:08:25 · 238 阅读 · 0 评论 -
打印有序单链表的公共部分
文章目录一、思路二、代码实现总结一、思路直接用两个指针或者引用对单链表进行遍历,如果两个指针的值不相同,就让小的那个往后移就行,直到相等二、代码实现代码如下: public static void printCommonPart(Node head1, Node head2) { System.out.print("Common Part: "); while (head1 != null && head2 != null) { if (head1.value &.原创 2021-11-25 00:01:51 · 244 阅读 · 0 评论 -
单链表,双向链表和他们的反转
文章目录前言一、单链表是什么?1.定义节点2.遍历3.反转二、双向链表是什么1.定义节点2.遍历3.反转前言简单的说一下两种表的结构,和他们的反转方法一、单链表是什么?只能单向移动的链表1.定义节点 public static class Node { public int value;//值 public Node next;//指向下一个的引用 public Node(int data) {//构造函数 this.value = data; } }2..原创 2021-11-24 23:52:35 · 178 阅读 · 0 评论 -
简单的有序表介绍
文章目录前言一、简单的有序表是什么?二、两种形式1.TreeSet2.TreeMap和一些常用操作总结前言一、简单的有序表是什么?二、两种形式1.TreeSet//定义节点public class HashAndTree { public static class Node{ public int value; public Node next; public Node(int val) { value = val; } } //重载比原创 2021-11-24 23:25:59 · 165 阅读 · 0 评论 -
哈希表的简单介绍
文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结原创 2021-11-24 22:56:24 · 202 阅读 · 0 评论 -
各种排序的坑和工程上优化方法
文章目录前言一空间复杂度O(1)的归并排序二原地归并排序三0 1 快排四 一般的改进排序都不是特别重要五 一个面试坑六 工程上的优化方法总结前言这次将容易犯的坑总结和工程上的一些优化方法。并且想说的是,目前还没有找到一个时间复杂度为O(N*LOGN) 空间复杂度为O(1)并且稳定的算法。因为想要某一方面的能力突出,就得牺牲一些东西。就像,想要有收获就得付出一样。一空间复杂度O(1)的归并排序这个可以说是很坑的一个坑了,首先实现方法很麻烦,是一个叫做(归并排序 内部缓存法),是某一篇论文上面.原创 2021-11-16 16:44:17 · 562 阅读 · 0 评论 -
排序方法稳定性总结
文章目录前言一、排序算法稳定性是什么?二、各个算法解析1.选择排序2.冒泡排序3.插入排序4. 归并排序5.快速排序6.堆排序7.桶排序思想的算法总结前言这次将介绍各种排序算法的稳定性和一些小结论一、排序算法稳定性是什么?它说的是,当一个排序算法对一个数组排序的时候,两个相同的数,在排序后相对位置有没有发生变化。没有则稳定二、各个算法解析1.选择排序选择排序算法是不稳定的,它是先遍历一次数组,找到一个最小值,和已排好序的边界后一个元素交换。这个交换的步骤就让选择排序变得不稳定。如果交换过.原创 2021-11-16 16:19:16 · 4508 阅读 · 0 评论 -
桶排序之基数排序(利用计数排序,实现优化)
文章目录前言一、基数排序二、实现步骤1.先求出这个数组的最大值的位数2.然后求new出一个同等于原数组的数组进行每一次位的遍历3.new出一个大小与进制基数一样的数组用来做桶划分区间4.接着遍历一次数组,将此时位数的count数组++5.然后接着count[i]=count[i]+count[i-1]6.然后从尾部遍历到头部7.最后将new出来的数组复制到原数组总代码总结前言基数排序不同于计数排序,它是按照数字本身,位一位的比较,同时赋予高位的更加大大优先级。这很类似与我们比较两个数,是不是从高位比.原创 2021-11-15 22:26:21 · 1408 阅读 · 0 评论 -
桶排序之计数排序
文章目录前言一、桶排序之计数排序是什么?二、实现过程1.找到数组中最大的数2.new一个最大值大一的空间,并开始加数3.逆序输出,不断减少新开空间的值三、总代码总结前言桶排序不同于其他的排序,他不是基于比较排序,他依赖于数据的状态,是否范围大等等,但是他的时间复杂度很诱人一、桶排序之计数排序是什么?一种排序方法,假设有一组数组,找出数组里面的最大值,然后另外开一个数组,这个数组的大小比原来的数组中最大值大一。然后遍历一次原来的数组,每一次讲另外一个数组中下标等于这时遍历的数组的值的值加一。最后.原创 2021-11-15 21:26:47 · 1112 阅读 · 0 评论 -
比较器(JAVA)
简单的聊几句它是什么它有什么用举个栗子它是什么<font color=#999AAA @Override是伪代码,表示重写。(当然不写@Override也可以)它有什么用<font color=#999AAA 编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。你如果没写@Override,而你下面的方法名不是父类所有的,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。举个栗子假设父类有了一个方法A你想在子类里面重新原创 2021-11-15 14:26:03 · 117 阅读 · 0 评论 -
比较器(Java)
这里写目录标题比较器比较器的实质是重载比较运算符定义方法调用方法比较器可以很好的应用在特殊标准的排序上比较器可以很好的应用在根据特殊标准排序的结构上比较器是Java内含的一个借口,可以在Java内实现一个方法,然后继承该借口,实现类似于C++的运算符重载,让内部既有的排序方法,和各种排序结构实现不同的排序比较器的实质是重载比较运算符定义方法 public static class IdAscendingComparator implements Comparator<Student>原创 2021-11-15 14:19:16 · 1139 阅读 · 0 评论 -
堆排序扩展题目(N*logK)
这里写目录标题堆排序扩展题目题意的理解思路1.复制前k项2.不断输入与弹出3.当已经达到数组边缘时,不在输入,只弹出代码堆排序扩展题目已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元 素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的 排序算法针对这个数据进行排序题意的理解显然是要我们找一个高效的算法,使数组排上序。我们选择了堆排序开一个k大小的堆,然后不断的加入原数组的值,并且每加入一个值就弹出一个堆顶(最小值)复制到原数组。因为只涉及弹出弹入。我们选原创 2021-11-14 11:50:01 · 112 阅读 · 0 评论 -
堆排序(JAVA)
这里写目录标题堆排序1,先让整个数组都变成大根堆结构,建立堆的过程:1)从上到下的方法,时间复杂度为O(N*logN)2)从下到上的方法,时间复杂度为O(N)2,把堆的最大值和堆末尾的值交换,然后减少堆的大小之后,再去调 整堆,一直周而复始,时间复杂度为O(N*logN)我的代码:堆排序1,先让整个数组都变成大根堆结构,建立堆的过程:1)从上到下的方法,时间复杂度为O(N*logN) //一个一个输入,向上调整,O(N*logN) for(int i = 0; i< arr.length原创 2021-11-14 11:34:46 · 362 阅读 · 0 评论 -
优先级队列(堆)
优先级队列1.什么是优先级队列2.什么时候用它什么时候不用它3.它的具体用法记得import两个库:3.1定义3.2输入输出1.什么是优先级队列优先级队列就是用库内已有的类,这个类名字是队列,其实不是队列是一种堆结构。它默认为最小堆,可以通过改比较器,实现最大堆。2.什么时候用它什么时候不用它当我们只需要做取出,和放入堆的方法时可以使用它为什么我们不在其他时候用它,明明有已有的函数?因为它在其他时候无法做到和手写堆一样时间复杂度低:例如改变某一个节点的值,然后重新实现堆。我们首先可以直接从这原创 2021-11-14 11:27:34 · 4397 阅读 · 0 评论 -
堆(java)
文章目录堆一、什么是堆二、堆结构的heapInsert与heapify操作2.1heapinsert2.2 代码2.3heapfy2.4代码5,堆结构的建立一个一个的输入:直接那全部数组:总结堆一、什么是堆用一个一维数组的方式表示一个完全二叉树假设此时节点的位置在i,其找父节点的方法就是:(i-1)/2其找左孩子的方法为:i*2+1其找右孩子的方法为 i*2+21完全二叉树中如果每棵子树的最大值都在顶部就是大根堆2完全二叉树中如果每棵子树的最小值都在顶部就是小根堆.原创 2021-11-14 01:00:01 · 136 阅读 · 0 评论 -
快速排序(java)
这里写目录标题快速排序不改进的快速排序1)把数组范围中的最后一个数作为划分值,然后把数组通过荷兰国旗问题分成三个部 分:左侧<划分值、中间==划分值、右侧>划分值2)对左侧范围和右侧范围,递归执行分析1)划分值越靠近两侧,复杂度越高;划分值越靠近中间,复杂度越低2)可以轻而易举的举出最差的例子,所以不改进的快速排序时间复杂度为O(N^2)快速排序不改进的快速排序1)把数组范围中的最后一个数作为划分值,然后把数组通过荷兰国旗问题分成三个部 分:左侧<划分值、中间==划分值、右侧>原创 2021-11-11 19:41:03 · 602 阅读 · 0 评论 -
(双指针)荷兰国旗问题
这里写目录标题荷兰国旗问题问题一问题二荷兰国旗问题问题一给定一个数组arr,和一个数num,请把小于等于num的数放在数 组的左边,大于num的 数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)问题二给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放 在数组的中间,大于num的数放在数组的 右边。要求额外空间复杂度O(1),时间复杂度 O(N)...原创 2021-11-11 18:40:17 · 544 阅读 · 0 评论 -
小和问题与逆序对问题(归并排序,面试每年必考)
归并排序的扩展小和问题和逆序对问题小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组 的小和。求一个数组 的小和。问题的转换* 原问题是找到一个数它左边的比它小的数,然后全部相加* 例如: 例子:[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-11-10 21:54:54 · 428 阅读 · 0 评论 -
归并排序(Java)
文章目录前言二、归并排序1)整体就是一个简单递归,左边排好序、右边排好序、让其整体有序2)让其整体有序的过程里用了排外序方法3)利用master公式来求解时间复杂度4)归并排序的实质时间复杂度O(N*logN),额外空间复杂度O(N)总结前言提示:以下是本篇文章正文内容,下面案例可供参考二、归并排序1)整体就是一个简单递归,左边排好序、右边排好序、让其整体有序2)让其整体有序的过程里用了排外序方法3)利用master公式来求解时间复杂度4)归并排序的实质时间复杂度O(N*logN),额原创 2021-11-10 17:16:49 · 373 阅读 · 0 评论 -
递归的一种理解(master公式)
文章目录前言一、剖析递归行为和递归行为时间复杂度的估算用递归方法找一个数组中的最大值,系统上到底是这么做的?思路代码为什么想减位移求平均值master公式的使用master公式是什么形式怎么看时间复杂度用上述递归公式套用数组最大值总结前言记录本菜鸡今天学的算法一、剖析递归行为和递归行为时间复杂度的估算 将以最简单的数组求最大值的递归,来看递归调用栈,和递归的时间复杂度怎么看(master公式)用递归方法找一个数组中的最大值,系统上到底是这么做的?思路分治法,将数组的最大值的求解,分成原创 2021-11-09 22:33:22 · 272 阅读 · 0 评论 -
异或运算的性质与扩展,以及一道面试题
文章目录一、异或运算的性质与扩展1)无进位相加2)异或运算的性质3)不用额外变量交换两个数代码如下:4)一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到这一个数算法设计思路代码5)一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到这两个数算法设计思路代码一、异或运算的性质与扩展1)无进位相加1.无论这个数是什么,只要它与零异或,它就会使本身。因为1^0=1 , 0 ^ 0=0;2.任何数与自己本身想异或结果为零N^N=0;3.异或运算可以理解为无进位的相加.原创 2021-11-06 22:44:36 · 165 阅读 · 0 评论 -
对数器的概念和使用
文章目录一、对数器的概念和使用1.概念2.随机样本生成器2.1Math.random()3.两排序算法实现对数一、对数器的概念和使用1.概念对数器的概念和使用1,有一个你想要测的方法a2,实现复杂度不好但是容易实现的方法b3,实现一个随机样本产生器4,把方法a和方法b跑相同的随机样本,看看得到的结果是否一样。5,如果有一个随机样本使得比对结果不一致,打印样本进行人工干预,改对方法a或者 方法b6,当样本数量很多时比对测试依然正确,可以确定方法a已经正确2.随机样本生成器2.1Mat.原创 2021-11-06 22:43:03 · 224 阅读 · 0 评论 -
二分查找,局部最小值
文章目录一、二分法的详解与扩展1.二分法详解2.在一个有序数组中,找某个数是否存在3.在一个有序数组中,找>=某个数最左侧的位置4.局部最小值问题一、二分法的详解与扩展1.二分法详解@1.在有序的数组中的查找方法,二分查找。基本思想是看中点是不是满足条件,不满足修正端点,再次看中点是否满足题意。一般思路是:初始化端点和中点然后while(L<R)赋值中点然后是否满足条件 返回然后情况一,正左端点=中值情况二,右端点=中值。(可能出现第三种情况)2.在一个有序数组中,找某.原创 2021-11-06 22:37:11 · 310 阅读 · 0 评论 -
选择排序,冒泡排序,插入排序
文章目录一、选择排序,冒泡排序,插入排序时间复杂度细节的讲解与复杂度分析1.1常数操作1.2选择排序1.2.1算法思路1.2.2时间复杂度的分析1.2.3代码实现当BIG O()相等时1.3冒泡排序1.3.1算法思路1.3.2时间复杂度分析1.3.3代码的实现1.插入排序2.代码3.时间复杂度一、选择排序,冒泡排序,插入排序时间复杂度细节的讲解与复杂度分析估计常数操作的指标1.1常数操作例如数组的直接取用,所做的操作其实只是做一个偏移量,它就是一个常熟操作链表得到i位置的值list.get.原创 2021-11-06 22:24:18 · 74 阅读 · 0 评论