![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
每日一算法
文章平均质量分 76
竺蠡
一只小菜鸟的学习心得
展开
-
关于每日一算法
本人写的每日一算法里面的东西来自网络和一本左程云老师编写的《程序员代码面试指南》一书,并不是本人原创的算法,只是作为个人的学习和参考,请不要拿来作为商业用途。原创 2016-09-24 19:57:29 · 535 阅读 · 0 评论 -
栈和队列(8)-- 最大值减去最小值小于或者等于num的子数组
要求:给定数组arr和整数num,保证max(arr[i..j]) - min(arr[i..j] 思考:普通的解法找到arr所以的子数组N²个,然后对每个子数组求max和min,过程时间复杂度为N²·N,此方法行不通。现在的方法如下:生成两个双端队列qmax和qmin,当子数组为arr[i..j]时,qmax维护了窗口子数组arr[i..j]的最大值更新的结构,qmin维护了窗口子翻译 2016-11-28 22:51:54 · 1484 阅读 · 4 评论 -
链表问题(3)-- 反转部分单项链表
要求:给定一个单向链表的头文件head,以及两个整数from和to,在单向链表上把第from个节点到第to个节点这一部分进行反转。例如: 1->2->3->4->5->null,from = 2,to = 4;调整后为 1->4->3->2->5->null。注意:1.如果链表长度为N,时间复杂度要求为O(N),额外时间复杂要求为O(1)。2.如果不满足 1思考:整个过翻译 2016-12-16 10:39:43 · 319 阅读 · 0 评论 -
链表问题(3)-- 反转单向和双向链表
要求:实现反转单向链表和双向联播的函数,要求链表长度为N,时间复杂度为O(N),额外空间复杂度要求为O(1)。实现代码:Node.javapackage algorithm_11;public class Node { public int value; public Node next; public Node(int data){ this.value = data翻译 2016-12-15 21:30:07 · 315 阅读 · 0 评论 -
链表问题(2)-- 删除聊表的中间节点和a/b处的节点
要求:给定链表的头节点head,实现删除链表的中间节点的函数。例如:链表:1->2->3->4->5,假设a/b的值为r;如果r = 0,不删除任何节点;如果r 在区间(0,1/5]上,删除节点1;如果r 在区间(1/5,2/5]上,删除节点2;如果r 在区间(2/5,3/5]上,删除节点3;如果r 在区间(3/5,4/5]上,删除节点4;如果r 在区间翻译 2016-12-11 23:10:27 · 598 阅读 · 0 评论 -
链表问题(1)-- 在单链表和双链表中删除倒数第K个节点
要求:分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。补充:链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必按顺序存储,链表在插入的时候可以达到O⑴的复杂翻译 2016-11-29 20:19:33 · 438 阅读 · 0 评论 -
栈和队列(6)--用栈来求解汉诺塔问题②
修改汉诺塔的规则,从左到右或者从右到做必须经过中间,也就是说实际动作只有4个:左到中、中到右、右到中和中到左。现在我们把左中右三个地点抽象成栈,依次记为LS、MS和RS。假设最初所有的塔都在LS上,4个动作其实是将一个栈的栈顶元素弹出然后压入到另一个栈的过程。例如如果是7层塔,最初所有的塔都在LS上,LS从栈顶到栈底依次是1-7,一个动作能发生的先决条件是不违反小压大的原则。那么,form栈弹转载 2016-10-29 23:37:56 · 833 阅读 · 0 评论 -
栈和队列(7)-- 生成窗口最大值数组
要求:有一个整数型数组arr和一个大小为w的窗口,窗口从最左边滑到最右边,每次挪动一位,求在窗口为w大小里面最大值排列。例如,数组为[4,3,5,4,3,3,6,7], 窗口大小为3时:[4 3 5] 4 3 3 6 7 窗口最大值为为5 4 [3 5 4] 3翻译 2016-11-09 22:08:05 · 393 阅读 · 0 评论 -
栈和队列(5)——用一个栈实现对另一个栈的排序
要求:一个栈的元素为整型,现在想将该栈的从栈顶到底按从小到大的顺序排序,只许申请一个栈。思考:将要排序的栈记为stack,申请辅助的栈记为help,在stack栈执行pop操作,弹出的元素记为cur,如果cur大于help的栈顶元素,则将cur压入help;如果cur小于help的栈顶元素,则弹出help栈顶元素压入stack直到cur的值大于等于help的栈顶元素。依次运行,直到st原创 2016-09-28 20:52:15 · 1230 阅读 · 0 评论 -
栈和队列(4)--猫狗队列
宠物、狗和猫的类如下:public class Pet { private String type; public Pet(String type){ this.type = type; } public String getPetType(){ return this.type; }}public class Dog extends Pet { public Dog()原创 2016-09-28 10:47:50 · 1142 阅读 · 0 评论 -
栈和队列(3)--如何仅用递归函数和栈操作逆序一个栈
要求:一个栈依次压入1、2、3、4、5,即从栈顶到栈底分别为5、4、3、2、1。将这个栈转置之后,从栈顶到栈底为1、2、3、4、5,也就是完成栈的逆序。只能用递归函数来实现,不能使用其他的数据结构。思考:我们可以设计两个递归函数,一个保证每次返回的是栈底的数,另外一个就是对栈进行反转。实验代码:package algorithm_3;import java.util.*;原创 2016-09-26 22:01:59 · 753 阅读 · 1 评论 -
栈和队列(2)--由两个栈组成的队列
要求:编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)。思考:队列的特点是先进后出,而栈的特点是先进后出。可以用两个栈正好把这个顺序反过来。方法:具体是一个栈实现压入栈,在压入数据时只往这个栈里压入,记为stackPush;另一个栈只作为弹出栈,在弹出数据时只从这个栈弹出,记为stackPop。注意:1.如果stackPush要网stack原创 2016-09-25 22:22:34 · 419 阅读 · 0 评论 -
栈和队列(1)——一个有getMin功能的栈
要求:1.pop、push、getMin操作的时间复杂度都是O(1);2.设计的栈类型可以使用现成的栈结构。思维:可以使用两个栈,一个用来保存当前栈中的元素,器其功能和一个正常的栈没区别,记为stackData;另一个用于保存每一步的最小值,这个栈记为stackMin。方法一:假设当前数据为newNum,先将其压入stackData,然后比较stackMin原创 2016-09-24 19:52:58 · 415 阅读 · 0 评论 -
链表问题(4)-- 环形单链表的约瑟夫问题
帮我对象做了很长时间的毕业设计,关于这个每日一算法在这段时间没有坚持下来,十分惭愧。去年到今年的几个月给她做了一个毕设的小项目,是一个关于人脸活体验证身份认证系统,我会在另一个版块给大家慢慢发一些关于其中的代码(因为她还没有答辩完,不能公开所有的代码),同时巩固自己的学习。好了,开始今天每日一算法的总结:题目:关于著名的约瑟夫问题是这样的:在古罗马时期,罗马人占领乔塔帕特后,3翻译 2017-03-12 16:27:33 · 404 阅读 · 0 评论