有趣的题目系列一:实现具有最大值、最小值、中间值的栈和队列

【数据结构】实现栈-输出最大值,最小值,时间复杂度O(1) @TOC 问题 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin和最大元素的getMax函数。在该栈中,调用getMin、getMax、push及pop的时间复杂度都是O(1).。 解题思路 用辅助栈记住每次入栈的当前最小值/最大值:在入栈时,往辅助栈中加入当前最小值/最大值;出栈时,辅组栈也出栈一个元素。最小值/最大值从辅助栈中获取栈顶元素。 基础代码实现 import java.util.ArrayList; import java.util.EmptyStackExceptio 阅读详情

番外知识:Java反射详解

番外二:

<?>是1.5的新特性,泛型
如果是?表示可以放Object类型以及他的子类
如果是String 表示只能接收String以及他的子类。
Class<?> c表示这个Class可以放任意的类,?表示object(所有类都隐性从Object继承的)
Class<String> c 只能接收String和他的子类(本文中的<E>也是这种情况)
Class c和Class<?>c性质是一样的
===========================================

题目来源:

1)http://blog.youkuaiyun.com/bigheadzzy/article/details/8002253

2)http://blog.youkuaiyun.com/yangzhongblog/article/details/12391959

文章中的大部分题目描述、代码均参考自上面二处,加以自己的一些理解。

-------------------------------------------------------------------切割-------------------------------------------------------------------------

Works Applications的笔试题:

要求实现下面两个接口,实现要求:运行速度快,每个操作时间复杂度不能相差太大。

一,实现Immutable的FIFO队列。也就是说要求入队和出队不会改变原来的队列。

package jp.co.worksap.recruiting;

public interface ExamImmutableQueue<E> {
	public ExamImmutableQueue<E> enqueue(E e);
	public ExamImmutableQueue<E> dequeue();
	public E peek();
	public int size();
}

二,实现可以查找最大、最小和中间值的FIFO队列。

public interface ExamPeekableQueue<E extends Comparable<E>> {
	
	public void enqueue(E e);
	public E dequeue();
	public E peekMedian();
	public E peekMaximum();
	public E peekMinimum();
	public int size();
}
接口一要求实现的API有:入队、出队、峰值和大小

接口二要求实现的有:入队、出队、中间值、最小值、最大值和大小

仔细对比,发现接口一和接口二的入队和出队的返回值是不同的。

原作者的代码是这样子的(我自己敲了一遍):

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.NoSuchElementException;
import java.util.Stack;

public class ExamImmutableQueueImpl<E> implements ExamImmutableQueue<E>{
    /*根据题目的要求是要求入队和出队均不影响原队列,所以这里用了final*/
	private final E[] queue;
    private final int size;
    
    public ExamImmutableQueueImpl(){//构造函数不需要标注<E>
    	queue = null;
    	size = 0;
    }
    public ExamImmutableQueueImpl(E[] queue){
    	this.queue = queue;
    	size = queue.length;
    }
	@Override
	public ExamImmutableQueue<E> enqueue(E e) {
		// TODO Auto-generated method stub
		if(e == null)
			throw new IllegalArgumentException();
		//需要考虑的是在内部变量插入一个新的元素,如何返回一个新的ExamImmutableQueueImpl对象
		//E[] clone = new E[size + 1];Java不可以定义泛型数组,ArrayList或者LinkedList是已经成型的泛型数组
		/*
		 * 可以考虑的一个方法
		 * ArrayList<E> arr = new ArrayList<E>();
		   E[] clone = (E[]) arr.toArray();
		*/
		@SuppressWarnings("unchecked")
		E[] clone = (E[])Array.newInstance(e.getClass(), size + 1);
		clone[0] = e;
		if(size != 0)
			System.arraycopy(queue, 0, clone, 1, size);
		return new ExamImmutableQueueImpl<E>(clone);
	}

	@Override
	public ExamImmutableQueue<E> dequeue() {
		// TODO Auto-generated method stub
		//////////////////////////////////
		/*题目要求的是FIFO,由入队我们得知新元素将被置在内部数组的首位,那删除应该从后面开始删除*/
		if(size == 0)
			throw new NoSuchElementException();
		//E[] clone = (E[]) new Object[size - 1]; 用Object取代也是一种好方法
		@SuppressWarnings("unchecked")
		E[] clone = (E[]) new Object[size - 1];
		System.arraycopy(queue, 0, clone, 0, size - 1);
		return new ExamImmutableQueueImpl<E>(clone);
	}

	@Override
	public E peek() {
		// TODO Auto-generated method stub
		if(size == 0)
			throw new NoSuchElementException();
		return (E) queue[size - 1];
	}

	@Override
	public int size() {
		// TODO Auto-generated method stub
		return this.size;
	}
    
}

第二题:作者的代码:

package jp.co.worksap.recruiting;

import java.util.Collections;
import java.util.LinkedList;
import java.util.NoSuchElementException;

public class ExamPeekableQueueImpl<E extends Comparable<E>> implements
		ExamPeekableQueue<E> {

	private LinkedList<SortedNode> objList = new LinkedList<SortedNode>();
	private SortedNode head = null;
	private SortedNode tail = null;

	class SortedNode implements Comparable<SortedNode>{
		public E e;
		public SortedNode next;
		public SortedNode(E e, SortedNode sn) {
			this.e = e;
			next = sn;
		}
		@Override
		public int compareTo(SortedNode sn) {
			// TODO Auto-generated method stub		
			return this.e.compareTo(sn.e);
		}
	}
	
	private void testNull() {
		if (objList.isEmpty()) {
			head = null;
			tail = null;
			throw new NoSuchElementException("No element");
		}
	}

	@Override
	public void enqueue(E e) {
		// TODO Auto-generated method stub
		if (e == null)
			throw new NoSuchElementException("Null object to eunqueue");
		
		if (head == null) {
			SortedNode sn = new SortedNode(e, null);
			head = sn;
			tail = sn;
			objList.add(sn);
		}
		else {
			SortedNode sn = new SortedNode(e, null);
			tail.next = sn;
			tail = sn;
			objList.add(sn);
			Collections.sort(objList);
		}
	}

	@Override
	public E dequeue() {
		// TODO Auto-generated method stub
		testNull();
		SortedNode sn = head;
		head = head.next;
		objList.remove(sn);
		Collections.sort(objList);
		return sn.e;
	}

	@Override
	public E peekMedian() {
		// TODO Auto-generated method stub
		testNull();
		return objList.get(objList.size()/2).e;
	}

	@Override
	public E peekMaximum() {
		// TODO Auto-generated method stub
		testNull();
		return objList.getLast().e;
	}

	@Override
	public E peekMinimum() {
		// TODO Auto-generated method stub
		testNull();
		return objList.getFirst().e;
	}

	@Override
	public int size() {
		// TODO Auto-generated method stub
		return objList.size();
	}

}

个人感觉是使用的策略较为原始。

下面是另一篇博文的转载:

在研究“如何实现具有最大值、最小值和中间值的栈和队列”前,我们先考虑以下问题,然后由此过度到题目问题。

1)如何用两个栈实现队列

2)如何用两个队列实现栈

3)如何实现包含获取最小值函数getMin()的栈

4)如何实现包含获取中间值函数getMedian()的栈

5)如何实现包含获取最小值函数getMin()的队列

1 如何用两个栈实现队列

在研究问题前,我们可以用2个栈模拟一下具体操作过程,可以总结出以下规律:

入队:元素插入stack1;

出队:如果stack2中为空,先将stack1中元素入栈stack2,然后再将stack2的栈顶元素出栈。否则直接将stack2中元素出栈。

队列为空:stack1和stack2同时为空

队列大小:为stack1和stack2大小之和

具体过程见下图(图来自《剑指offer》)


Java实现代码如下

[java]  view plain copy
  1. public class QueueByStack<E extends Comparable<E>>  {  
  2.       
  3.     private LinkedList stack1=null;  
  4.     private LinkedList stack2=null;  
  5.       
  6.     //constructor  
  7.     public QueueByStack(){  
  8.         stack1=new LinkedList();  
  9.         stack2=new LinkedList();  
  10.     }//end QueueByStack  
  11.           
  12.     public void insert(E e){  
  13.           stack1.addLast(e);  
  14.     }//end insert()  
  15.       
  16.     public E remove(){  
  17.         if(!isEmpty()){  
  18.             if(stack2.isEmpty()){  
  19.                 stack1Tostack2();  
  20.             }//end if  
  21.   
  22.             return (E)stack2.removeLast();  
  23.         }//end if  
  24.         else{  
  25.             System.out.println("queue is empty");  
  26.             return null;  
  27.         }//end else  
  28.     }//end remove  
  29.       
  30.     //将stack1中元素入栈stack2  
  31.     private void stack1Tostack2(){  
  32.         while(!stack1.isEmpty()){  
  33.             stack2.addLast(stack1.removeLast());  
  34.         }//end while      
  35.     }//end stack1ToStack2()  
  36.       
  37.     public boolean isEmpty(){  
  38.         return stack1.isEmpty() && stack2.isEmpty();  
  39.     }//end isEmpty()  
  40.       
  41.     public int size(){  
  42.         return (stack1.size()+stack2.size());  
  43.     }//end size()  
  44.   
  45.     /** 
  46.      * @param args 
  47.      */  
  48.     public static void main(String[] args) {  
  49.         QueueByStack q=new QueueByStack();  
  50.         q.insert(1);  
  51.         q.insert(2);  
  52.         q.insert(3);  
  53.         System.out.println(q.remove());  
  54.         System.out.println(q.remove());  
  55.         q.insert(4);  
  56.         System.out.println(q.remove());  
  57.         System.out.println(q.remove());  
  58.     }  
  59. }  

2 如何用两个队列实现栈

还是先用2个队列模拟栈的出栈和入栈过程,可以得出以下规律:

入栈:压入非空的那个队列

出栈:将非空队列中的n-1个元素压入空的队列中,然后将第n个元素出栈。

具体过程见下图(图来自《剑指offer》)


3 如何实现包含获取最小值函数的栈

问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数。在该栈中,调用getMin、push及pop的时间复杂度都是O(1).

思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中加入当前最小值;stack1元素出栈时,stack2也出栈一个元素。最小值从stack2中获取及栈顶元素。

4 如何实现包含获取中间值函数的栈

如果能对栈中元素进行排序,那么排序好的中间值即为所求。问题3和问题4的具体代码如下,代码中同时实现了获取栈的最大值、最小值和中间值

[java]  view plain copy
  1. public class Stack<E extends Comparable<E>> {  
  2.       
  3.     private LinkedList<E> heartStack=new LinkedList<E>();   
  4.     private LinkedList<E> curMinStack=new LinkedList<E>(); //辅助栈,用于记录当前最小值  
  5.     private LinkedList<E> curMaxStack=new LinkedList<E>(); //辅助栈,用于记录当前最大值  
  6.       
  7.     public void push(E e){  
  8.            heartStack.push(e);  
  9.            //当前最小值入栈curMinStack  
  10.            E currentMin=curMinStack.peek();  
  11.            if(currentMin.compareTo(e)>0){  
  12.                curMinStack.push(e);  
  13.            }//end if  
  14.            else  
  15.                curMinStack.push(currentMin);  
  16.              
  17.            //当前最大值入栈curMinStack  
  18.            E currentMax=curMinStack.peek();  
  19.            if(currentMax.compareTo(e)<0){  
  20.                curMaxStack.push(e);  
  21.            }//end if  
  22.            else  
  23.                curMaxStack.push(currentMax);  
  24.     }//end push()  
  25.       
  26.     public E pull(){  
  27.         if(isEmpty())  
  28.             return null;  
  29.         else{  
  30.             E e=heartStack.poll();  
  31.             curMinStack.poll();  
  32.             curMaxStack.poll();  
  33.             return e;  
  34.         }//end else  
  35.     }//end pull()  
  36.       
  37.     public E getMax(){  
  38.         return curMaxStack.peek();  
  39.     }//end getMax()  
  40.       
  41.     public E getMin(){  
  42.         return curMinStack.peek();  
  43.     }//end getMin()  
  44.       
  45.     public int size(){  
  46.         return heartStack.size();  
  47.     }//end size()  
  48.       
  49.     public boolean isEmpty(){  
  50.         return heartStack.isEmpty();  
  51.     }//end isEmpty()  
  52.       
  53.     public E getMedian(){  
  54.         E[] e=(E[]) heartStack.toArray();  
  55.         Arrays.sort(e);  
  56.         return e[e.length/2];  
  57.     }//end getMedian()  
  58.       
  59.     public E[] toArray(){  
  60.         return (E[])heartStack.toArray();  
  61.     }//end toArray()  
  62. }  

5 如何实现包含获取最小值函数的队列

问题:定义队列的数据结构,请在该类型中实现一个能够得到队列的最小元素的getMin函数。在该队列中,调用getMin、insert及remove的时间复杂度都是O(1).

思路1:用最小堆实现优先队列,获取最小值时间复杂度为O(nlogn),但优先队列只能获取最小值,remove获取的不是先入队的元素。

思路2:

如果能用栈有效地实现队列,而栈的获取最小值的操作又很容易实现,那么队列的获取最小值的操作也很容易完成。

因为上面可用2个栈实现栈的min函数,而用2个栈可以实现队列。所以可以用已实现了获取最小值的栈stack1和stack2实现队列,而整个队列的最小值从min(stack1.getMin(),stack2.getMin())中获取。具体实现代码见问题6中代码。

6 如何实现具有最大值、最小值和中间值的栈和队列

问题5解决了用O(1)时间获取栈的最小值,那么解决最大值的问题也迎刃而解。对于获取队列的中间值,可以将队列中所有元素排序,然后获取排序后的中间值。

具体实现如下(代码中的stack类为上述问题4中已实现的可以获取最大值和最小值的栈):

[java]  view plain copy
  1. public class ExmaPeekableQueue<E extends Comparable<E>>  implements IExamPeekableQueue{  
  2.     Stack stack1=new Stack();  
  3.     Stack stack2=new Stack();  
  4.       
  5.     @Override  
  6.     public void enqueue(Comparable e) {  
  7.         stack1.push(e);       
  8.     }//end enqueue()  
  9.   
  10.     @Override  
  11.     public Comparable<E> dequeue() {  
  12.         if(stack2.isEmpty()){  
  13.             stack2.push(stack1.pull());  
  14.         }//end if  
  15.           
  16.         return stack2.pull();  
  17.     }//end dequeue()  
  18.   
  19.     @Override  
  20.     public Comparable<E> peekMedian() {  
  21.         Comparable[] arr=null; //用于存储队列中当前元素的数组  
  22.           
  23.         if(stack1.isEmpty()){  
  24.             arr=stack2.toArray();  
  25.         }//end if  
  26.         else if(stack2.isEmpty()){  
  27.             arr=stack1.toArray();  
  28.         }//end if  
  29.         else{  
  30.             arr=new Comparable[size()];  
  31.             Comparable[] arrE1=stack1.toArray();  
  32.             Comparable[] arrE2=stack2.toArray();  
  33.               
  34.             //将2个栈中的元素复制到一个数组中  
  35.             int i=0;  
  36.             for(;i<stack1.size();i++){  
  37.                 arr[i]=arrE1[i];  
  38.             }//end for  
  39.               
  40.             for(int j=0;j<stack2.size();j++){  
  41.                 arr[++i]=arrE2[j];  
  42.             }//end for  
  43.         }//end else  
  44.               
  45.         Arrays.sort(arr);  
  46.         return arr[arr.length/2];  
  47.     }//end peekMedian()  
  48.   
  49.     @Override  
  50.     public Comparable peekMaximum() {  
  51.         Comparable max1=stack1.getMax();  
  52.         Comparable max2=stack2.getMax();  
  53.           
  54.         if(max1.compareTo(max2)>0){  
  55.             return max1;  
  56.         }//end if  
  57.         else  
  58.             return max2;  
  59.     }  
  60.   
  61.     @Override  
  62.     public Comparable<E> peekMinimum() {  
  63.         Comparable min1=stack1.getMin();  
  64.         Comparable min2=stack2.getMin();  
  65.           
  66.         if(min1.compareTo(min2)>0){  
  67.             return min2;  
  68.         }//end if  
  69.         else  
  70.             return min1;  
  71.     }//end peekMinimum()  
  72.   
  73.     @Override  
  74.     public int size() {  
  75.         return (stack1.size()+stack2.size());  
  76.     }//end size()  
  77. }//end class  

========================

当然如果知识为了实现栈的最大值最小值中间值功能,而不要求使用队列,那完全可以使用内部栈解决。

在上面的博文中,使用两个队列(数组)实现的栈的先入后出功能,

可以有两种实现模式:

当在Array1 输入1 2 3 之后要删除3 则需要借助Array2 -> Array1:空  Array2为 1 2

这个时候新来的元素应该插入到Array1 还是Array2呢。

如果是插入到Array2 则,若后面需要删除某元素,则必须整个数组移到Array1

如果是插入到Array1 则只需要将后面输入的移到Array2。这是个较为优化的方案。

队列实现插入,弹出,找到最大值和最小值的操作 去年10月份左右的时候,一位师兄曾说到他的一篇面试题,好像是实现一个队列,这个队列包含插入,弹出,找到最大值和最小值的操作。 对于实现一个栈,这个栈包含插入,弹出,找到最大值和最小值的操作,这个栈的实现相对于上面队列的实现更简单。 先说栈的实现: 使用三个栈来保存原栈,栈最大值和栈最小值。 stack st; stack maxst; stack minst; void push 阅读详情

相关推荐

【MIT-BEVFusion代码解读】第四篇:融合特征fuser和解码特征decoder

的大小,实际上源代码也是这么做的。最后将得到两个分支的特征进行。,第一个特征使用卷积降低通道数即可,第二个则需要反卷积来提升。所以backbone只有两个分支,都是5个卷积模块组成。的长和宽都减半至90,然后在经过5个相同的。将通道降至128,后面再接5个相同的。,将通道数128上至256,并且将。特征进行融合,这里使用的。部分由两部分组成,分别是。,这个分支首先经过第一个。,然后再卷积得到 =>提取特征,最后得到特征。得到了两个大小不同的。

非晚非晚的博客 2956

java 获取最小值_实现O(1)获取最大最小值的栈----java

实现O(1)获取最大最小值的栈和队列----java一.怎样实现包括获取最小值函数的栈问题:定义栈的数据结构,请在该类型中实现一个可以得到栈的最小元素的getMin函数。在该栈中,调用getMin、push及pop的时间复杂度都是O(1).最小值思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中增加当前最小值;stack1元素出栈时,stac...

weixin_36434922的博客 419

Transformer凭什么取代RNN?深入拆解自注意力机制与梯度消失问题的终极对决

本文深入探讨了Transformer如何通过自注意力机制解决RNN的梯度消失问题,成为自然语言处理领域的新标准。通过对比RNN和Transformer的架构差异,揭示了自注意力机制在并行计算、长期依赖处理等方面的技术优势,并提供了实际任务中的性能对比数据。

f6g7h8i9j的博客 190

O(1)时间复杂度来获得队列或栈的最大值或者最小值

  该类题型通常是让自己设计并封装应用程序接口(Application Programming Interface, API),即一些预先定义的函数,或指软件系统不同组成部分衔接的约定。   通常是使用常用的数据结构组合或是作为辅助空间来实现这些接口。具体选用何种数据结构来实现,一是依照题目中对时间或空间复杂度的要求,二是在平常的练习当中多加总结。   以下列出相关题目,题目中对时间复杂度的要求均为O(1)O(1)O(1),所以很容易想到用空间换取时间的思路。 (一) 剑指 Offer 30. 包含min函

To the beyond and infinity! 3728

标准高斯过程回归(Gaussian Processes Regression, GPR)从零开始,公式推导

标准高斯过程回归从零开始公式推导

qq_43587949的博客 1万+

江科大51单片机笔记【1】单片机及开发板介绍

单片机,Micro Controller Unit,简称MCU,内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(传感器)、处理(CPU)和硬件设备(电机、LED)的控制单片机算是一个袖珍版计算机,是一个完整的计算机系统,成本低体积小结构简单单片机的使用领域:智能仪表、实时工控、通讯设备、导航系统、家用电器等。

2301_80195807的博客 833

数据结构——递归法求解栈中最大值和最小值

【递归法求解最大值和最小值】 问题描述:若一个无序的线性表A[MaxSize]采用顺序存储方式,元素类型为整型数。试写出递归算法求出A中的最大元素和最小元素。 要求: 顺序表的数据通过调用算法initRandomize()随机产生。 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #define OK 1 #define ERROR 0 #de...

○( ^皿^)っHiahiahia…的博客 2680

告别Vivado自带编辑器!手把手教你用Sublime Text 4 + Icarus Verilog搭建FPGA开发环境(Windows 10/11)

本文详细介绍如何在Windows 10/11系统下,使用Sublime Text 4和Icarus Verilog搭建高效的FPGA开发环境,替代Vivado自带编辑器。通过配置语法检查、代码高亮和智能补全等功能,提升Verilog开发效率,实现专业级工作流。

weixin_30684743的博客 427

java实现栈-输出最大值,最小值,时间复杂度O(1)

问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数。在该栈中,调用getMin、push及pop的时间复杂度都是O(1). 最小值思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中加入当前最小值;stack1元素出栈时,stack2也出栈一个元素。最小值从stack2中获取及栈顶元素。O(1) 最大值思路:...

在黑暗中寻找光明 2774

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

1. 设置目标原件时,选择切换,这样就可以实现,当原件展示时,点击自动隐藏,隐藏时自动显示; 2. 展开/收起原件(推动/拉动原件)设置为方向**向下**

专注于计算机研发知识和资讯分享 1381

29、集成电路测试技术解析

本文深入解析了集成电路测试技术,涵盖定制电路测试资源与策略、混合模拟/数字电路测试方法、数字测试模式生成难点与解决方案,以及可控性和可观测性的核心概念。同时详细讨论了固定故障、桥接故障和开路故障等主要故障模型及其检测方法。在测试技术的综合应用与优化方面,提出了合理配置测试资源、优化测试模式和设计测试流程的策略。最后展望了测试技术的发展趋势,包括集成化测试、自动化测试和智能化测试。通过全面掌握这些测试技术,可以有效提高集成电路的质量和可靠性,推动集成电路产业的发展。

work3的博客 205

如何实现具有最大值、最小值和中间值的栈和队列

在研究“如何实现具有最大值、最小值和中间值的栈和队列”前,我们先考虑以下问题,然后由此过度到题目问题。 1)如何用两个栈实现队列 2)如何用两个队列实现栈 3)如何实现包含获取最小值函数getMin()的栈 4)如何实现包含获取中间值函数getMedian()的栈 5)如何实现包含获取最小值函数getMin()的队列 1 如何用两个栈实现队列 在研究问题前,我们可以用

公众号(猴子数据分析) 4942

结构力学仿真软件:STAAD.Pro:结构抗震设计与STAAD.Pro应用_2024-08-10_11-49-29.Tex

STAAD.Pro是一款广泛应用于结构工程领域的仿真软件,由Bentley Systems开发。它能够进行结构分析和设计,支持多种结构类型,包括桥梁、建筑物、塔架等。STAAD.Pro提供了强大的建模工具,用户可以轻松创建复杂的结构模型,并进行静态和动态分析。软件还支持多种载荷组合,包括地震载荷,以及提供详细的报告和图纸输出,便于工程师进行设计和审查。STAAD.Pro是一款广泛应用于结构工程设计的软件,其界面直观,功能强大,能够进行结构分析与设计。菜单栏。

977

队列的最大值 - 栈的最小值 - LRU缓存机制

leetcode三道题目:队列的最大值 - 栈的最小值 - LRU缓存机制1. 队列的最大值:使用双端队列2. 栈的最小值:使用辅助栈3. LRU缓存机制:使用队列和哈希表4.总结 写在前面,这是leetcode上三道解决方法有共同之处的地方,由于在写代码的时候觉得有相似之处,所以打算拿出来做一个横向的比较和总结 1. 队列的最大值:使用双端队列 这道题比第二题稍微难点,我是先接触了第二题,然后再接触这题,绕了点弯路,以为可以按照第二题的思路来,其实不是 题目描述 剑指 Offer 59 - II. 队

薯饼的博客 484

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

双栈队列实现快速获取队列最大值最小值

含有记录栈的数组栈实现,两个记录栈,一个记录最大值,一个记录最小值。 import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; public class MaxStack> { private List stack; private List max

magic881213的专栏 2299

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

队列、栈的互相实现及快速获取最大最小值等相关问题汇总

1.两个栈实现一个队列 JZ9:用两个栈实现队列 思路: 不用每次出队完后都把栈B的元素倒腾回栈A。而是依照以下原则: 入队都进栈A,出队都从栈B出,一旦要出队但栈B为空,就将栈A元素依次弹出并入栈B 复杂度分析:由于每个元素都经历了进A出A和进B出B,因此时间复杂度o(n),空间复杂度o(n) 代码实现: class Solution: def __init__(self): self.stack1 = [] self.stack2 = [] def pu

weixin_44398263的博客 733

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

编程之美系列之栈和队列2—在O(1)的时间内得到队列的最大或者最小值

上一篇博客http://blog.youkuaiyun.com/kay_zhyu/article/details/8869542中提到,在O(1)的时间内取得栈的最大或者最小值,作法是利用一个辅助栈去动态的维护这个最小值。但是如果要在O(1)的时间内取得队列的最小值,那这就有点难办的吧。毕竟队列的操作特点是先进先出,跟栈的完全相反的,我们没办法像栈那要用一个动态的数组去维护这个最小值。怎么办呢?既然栈的最小值

kay_zhyu的专栏 4100

牛客网 栈和队列 C++实现 题目汇总

1:设计一个有getMin功能的栈 class MinStack { public: //stackData.top()只会大于或等于stackMin.top()的值 stack<int>stackData; stack<int>stackMin; MinStack() {} void push(int x) { stackData.push(x);//栈空或者x<=stackMin.top() if

qq_44787993的博客 421

1.30数据与结构算法学习日记(单调队列和栈的运用)

2.指令1是往正方向走,指令2是往负方向走,指令3其实就是相当于求当前队列的长度,对于指令1和指令2我们就循环判断每个队列里的元素加上x方向长度后是否在【-k,k】中如果不在就弹出队列因为是可能会在队尾弹出也会在队列头弹出,所以我们选择用单调队列,双端队列。3.队列实现后,因为是滑动窗口,所以要判断队列头是否在界内(目前所在的位置i减去当前队列头的大于等于k规定的范围大小时,应把队列头往后移,就是相当于把当前队列头删去,然后给后一个充当队列头)数轴的长度是有限制的,具体的范围是 [−k,k]。

weixin_64589886的博客 2476

栈和队列---算法题目

1.设计一个有getMin功能的栈 1.解题思路 方案一: push:将每次插入的新值和stackMin的栈顶元素比较,如果新值较小就插入到stackMin,否则什么也不干 pop:stackData出栈的元素如果是栈中最小元素,则stackMin对应的元素也要出栈 方案二: push:将方案二“什么也不干”这件事改为重复插入stackMin栈顶元素 pop:因为push操作重复的插入,则pop时不需要比较stackData出栈元素是否是stackMin栈顶元素,两个栈 同步出栈即可。 2.遇

flipped___的博客 592

动态数据中求最大值或最小值

1、包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 思路 用一个栈st1装载数据,利用一个辅助栈st2记录此时st1栈中的最小数据,每次元素入栈st1,和此时st2中的栈顶元素比较,若入栈元素比st2栈顶元素小或等于栈顶元素,则入栈st1同时入栈st2,;否则只入栈st1。st1出栈时,也同st2栈顶元素比较,若...

ysl_ysl123的博客 1875

实现O(1)获取最大最小值的栈----java

实现O(1)获取最大最小值的栈和队列----java 一.如何实现包含获取最小值函数的栈 问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数。在该栈中,调用getMin、push及pop的时间复杂度都是O(1). 最小值思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中加入当前最小值;st

毛毛虫的小哈 1万+

用队列实现栈 / 用栈实现队列 / 实现带最小值的栈【C++】

C++的 STL stack和 STL queue 头文件分别是 <stack> 和 <queue> 注意:使用需要namespace std STL stack基本操作 stack<int> S; S.empty(); S.push(10); S.pop(); STL queue基本操作 queue<int> Q; Q.empty(); Q.push(5); Q.pop(); Q.front(); 用队列数据结构实现栈 使用队列实现栈的下列操

Jinondo's Blog 237

算法系列之栈和队列(一):设计一个栈,可以获取栈中最大值以及最小值

引言 从本篇开始,会持续写一点关于算法以及面试题目的微博,主要是网上一些笔试题中关于算法的部分,这些题目来自于网络以及书籍中。主要会进行题目的分析以及编码实现。 一、题目 实现一个获取栈中最小值的栈,除了需要实现栈的基本功能,还需要可以获取栈中最小值的功能 二、分析 栈的基本功能就是先入后出,基本功能的话一个栈就可以实现了。但是如果需要另外实现获取栈中最小值,则需要另外一个栈去存储这...

1907

【C#算法实现】最大值减去最小值小于或等于num的子数组数量

本文用C#实现了《程序员代码面试指南》中的最大值减去最小值小于或等于num的子数组数量。

qq_44951699的博客 993
上一篇: 【面试题】树的高度
下一篇: C++ Again(1):文件读入与写出
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值