剑指offer30题

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

看到这个 题目,第一想法就是,我要不定义一个变量,指向当前栈中最小的值,每次入栈,就和最小值进行比较,如果比最小值小,则最小值指向该值,否则最小值依旧。

但很快遇到问题,如果在出栈时,最小值出来后,比最小值小的值呢?无法查到了啊!

于是思路出来了,用一个辅助栈,第一次将入栈的值放入,接下来每一次,和栈顶的值进行比较,如果比它小,则将该值放入,否则把栈顶的值再次放入。

此题参考剑指offer书的思路。

下面附代码。

package com.algorithm04;

import java.util.Stack;

public class Algorithm30 {
	Stack<Integer> date = new Stack<Integer>();
	Stack<Integer> min_date = new Stack<Integer>();

	public void push(int node) {
		date.push(node);
		if(min_date.size()==0||min_date.peek()>node){
			min_date.push(node);
		}else{
			min_date.push(min_date.peek());
		}
	}

	public void pop() {
		date.pop();
		min_date.pop();
	}

	public int top() {
		return date.peek();
	}

	public int min() {
		return min_date.peek();
	}

	public static void main(String[] args) {

	}
}

  

时间: 2024-10-18 15:01:36

剑指offer30题的相关文章

剑指Offer--第16题 数值的整数次方

第16题 数值的整数次方 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路 看到有点懵,第一感觉觉得是不是应该考虑0的0次或者负数情况,还有就是浮点类型没办法使用"="号,最后自己以偷懒的方式直接调用Java的API,如果面试题中不让调用库函数,那么基本上这题就是挂了可能. 以上题目描述来自牛客,没有对使用做限制.真正的剑指offer上有限制条件不得使用库函数,同时不需要考虑大数问题. 自己的low代码 publ

剑指offer31题

题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) 模拟一个入栈操作,每次匹配即可.不想解释太多.直接看代码吧 package com.algorithm04; import java.util.Stack; public class Alg

剑指Offer30 从1到n整数出现1的个数

1 /************************************************************************* 2 > File Name: 30_NumerOf1.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月01日 星期四 20时46分06秒 6 ******************************************

剑指offer47题

题目:在一个mXn的棋盘的每一格放有一个礼物,每个礼物都有一定的价值(价值大于0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或者向下移动一格,直到到达棋盘的右下角.给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物? 1 10  3 8 12   2  9 6 5 7  4  11 3 7  16 5 可以看到,价值最大的就是,1->12->5->7->7->16->5.即标下划线的数字. 那么现在,最好的方法就是动态规划了.这就是一道非常简单的动态

剑指offer42题(2)

在网上查了另外一种方法,其实也算同一种.有一些动态规划的思想.代码如下: package com.algorithm04; public class Algorithm42_2 { public int maxSumInSubArray(int[] array){ if(array.length<0) return 0; if(array.length==1) return array[0]; int max,begin,end,len; int[] c = new int[100]; begi

剑指offer28题

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5废话不多说,直接强行上代码.树的创建和打印已经封装好,直接调用. package com.algorithm04; import com.tools.TreeBinaryFunction; import com.tools.TreeNode; public class Algorithm27 {

剑指offer42题

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住?(子向量的长度至少是1) package com.algorithm05; public class Algorithm42

剑指offer55题

输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. package com.algorithm05; import com.tools.TreeBinaryFunction; import com.tools.TreeNode; public class Algorithm55 { public static int TreeDepth(TreeNode root) { if(root==null) return 0; int

剑指offer-第12题方法总结

<span style="font-family:SimSun;"></span><pre name="code" class="cpp"> 题目:输入数字n,按顺序打印从1位到最大n位的十进制整数 .例如:输入3,则从1打印到999. 乍一看,这个问题很简单啊!!! void output(int n) { int i = 0; for (i = 1; i < pow(10, n ); i++) { p