昨天下去去面试微信实习,遇到这道算法题,当时被卡住,故今天把它写出来做下知识整理,
原题:实现一个栈,满足min() pop() push()方法的时间复杂度都为O(1).( min()返回栈中最小元素 )
思路1:用一个变量minItem记录栈中的最小值,在push()中 每次加入一个item就跟minItem对比,item更小,只item赋给minItem,然后再min() 中直接return minItem;
这种思路没考虑在pop()过程中,对minItem的影响,当栈顶元素是minItem,执行pop() 后minItem就不知道指向谁了,因为栈只记录最小值而起,至于最小值之前那些大小关系都没记录
正确思路:为了实现更低的时间复杂度,我们都会想到用空间去换时间,所有这里增加一个数组来nextMinItem[index] 元素大小关系。如果当前最小值是 对象 item1 当push进来的item2比 item1更小,且元素个数从原本的a增加到a+1 这时候我们用我们就应该把item2这个更小的item赋给minItem 然后用nextMinItem[a+1] = item1 来记录 item2 后面的次小值,这样一来当item2 这个栈顶被pop()掉的话,我们就可以minItem = nextMinItem[a+1],来恢复minItem。
代码:
package 腾讯面试题; public class Stack { private int itemCount = 0; private Item minItem = null; private Item[] nextMinItem; private Item stackTop = null; private int maxSize = 100; public Stack() { nextMinItem = new Item[maxSize]; } class Item { int Data; Item nextItem; public Item(int data) { this.Data = data; } } public boolean push(Item item) { if (itemCount == maxSize) { System.out.println("栈已满"); return false; } itemCount++; if (minItem == null) { minItem = item; } else { if (item.Data < minItem.Data) { nextMinItem[itemCount] = minItem; minItem = item; } } item.nextItem = stackTop; stackTop = item; return true; } public boolean pop() { if (itemCount == 0) { System.out.println("栈是空的,无法出栈"); return false; } if (stackTop == minItem) { minItem = nextMinItem[itemCount]; } stackTop = stackTop.nextItem; itemCount--; return true; } public Item min() { if (itemCount == 0) { System.out.println("栈是空的,无最小值"); return null; } return minItem; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Stack stack = new Stack(); stack.push(stack.new Item(5)); System.out.println("push:min=" + stack.min().Data+" itemCount="+stack.itemCount); stack.push(stack.new Item(4)); System.out.println("push:min=" + stack.min().Data+" itemCount="+stack.itemCount); stack.push(stack.new Item(3)); System.out.println("push:min=" + stack.min().Data+" itemCount="+stack.itemCount); stack.push(stack.new Item(2)); System.out.println("push:min=" + stack.min().Data+" itemCount="+stack.itemCount); stack.push(stack.new Item(1)); System.out.println("push:min=" + stack.min().Data+" itemCount="+stack.itemCount); stack.pop(); System.out.println("pop :min=" + stack.min().Data+" itemCount="+stack.itemCount); stack.pop(); System.out.println("pop :min=" + stack.min().Data+" itemCount="+stack.itemCount); stack.pop(); System.out.println("pop :min=" + stack.min().Data+" itemCount="+stack.itemCount); stack.pop(); System.out.println("pop :min=" + stack.min().Data+" itemCount="+stack.itemCount); stack.pop(); System.out.println("栈结构为:\n|____1_____|\n|____2_____|\n|____3_____|\n|____4_____|\n|____5_____|\n"); } }
运行结果:
push:min=5 itemCount=1 push:min=4 itemCount=2 push:min=3 itemCount=3 push:min=2 itemCount=4 push:min=1 itemCount=5 pop :min=2 itemCount=4 pop :min=3 itemCount=3 pop :min=4 itemCount=2 pop :min=5 itemCount=1 栈结构为: |____1_____| |____2_____| |____3_____| |____4_____| |____5_____|
博友thihy的另一种方法:
把nextMinItem嵌入Node中,这样就不需要限制maxSize。
- class Node{
- T data;
- Node min;
- Node pre;
- Node(T data, Node pre){
- this.data = data;
- this.pre = pre;
- // 更新目前为止最小的元素(包括自己)
- if(pre!=null && pre.min.data <= data){
- this.min = pre.min;
- }else{
- this.min = this;
- }
- }
- }
使用top来保存顶点
- Node top;
则push、pop和min分别为
- void push(T data){
- top = new Node(data=data,pre=top);
- }
- T pop(){
- assert top!= null;
- T result = top.data;
- top = top.pre;
- return result;
- }
- T min(){
- assert top!=null;
- return top.min.data;
- }
相关推荐
【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大...
微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出,旨在提供便捷的、无需下载安装即可使用的应用体验。"微信小程序-今日头条"是一个特定的小程序模板,主要用于构建类似今日头条这样的新闻...
微信小程序,作为腾讯倾力打造的一款轻量级应用,凭借其独特的优势在移动开发领域崭露头角。它无需下载安装,用户扫一扫或搜一下即可打开应用,体验上更加便捷高效。小程序不仅拥有近似原生App的用户体验,还完美...
微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,旨在提供便捷的、无需下载安装即可使用的应用体验。"微信小程序-微信小程序-新闻客户端"这个项目,显然是一个专门用于展示新闻资讯的微信...
微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出,旨在提供便捷的、无需下载安装即可使用的线上服务。本主题聚焦于微信小程序的组件应用与实际开发,通过一系列DEMO来深入理解其核心功能和...
微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于智能手机,为用户提供便捷的、无需下载安装即可使用的线上服务。"微信小程序-cnode社区版.zip" 是一个压缩包,其中包含了针对cnode社区的微信小...
微信小程序,作为腾讯倾力打造的一款轻量级应用,凭借其独特的优势在移动开发领域崭露头角。它无需下载安装,用户扫一扫或搜一下即可打开应用,体验上更加便捷高效。小程序不仅拥有近似原生App的用户体验,还完美...
微信小程序,作为腾讯倾力打造的一款轻量级应用,凭借其独特的优势在移动开发领域崭露头角。它无需下载安装,用户扫一扫或搜一下即可打开应用,体验上更加便捷高效。小程序不仅拥有近似原生App的用户体验,还完美...
微信小程序源码-仿腾讯视频小程序.zip微信小程序源码-仿腾讯视频小程序.zip微信小程序源码-仿腾讯视频小程序.zip微信小程序源码-仿腾讯视频小程序.zip微信小程序源码-仿腾讯视频小程序.zip微信小程序源码-仿腾讯视频...
微信小程序,作为腾讯倾力打造的一款轻量级应用,凭借其独特的优势在移动开发领域崭露头角。它无需下载安装,用户扫一扫或搜一下即可打开应用,体验上更加便捷高效。小程序不仅拥有近似原生App的用户体验,还完美...
微信小程序是腾讯公司推出的一种轻量级应用开发平台,它主要针对移动互联网,尤其是智能手机用户,提供无需下载安装即可使用的便捷服务。"微信小程序-微信小程序-滴滴拉屎"这个项目,从标题来看,显然是一个基于...
本篇文章将深入探讨如何使用uniapp和微信小程序,结合腾讯云的服务,来实现这样的功能。 首先,uniapp是一个跨平台的开发框架,它允许开发者用一套代码库创建多端应用,包括iOS、Android、H5以及微信小程序等。它的...
微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,旨在方便用户在无需下载安装的情况下,快速体验各类服务。本项目是“微信小程序-笑话集(完整带后台)”的小程序源码,提供了从前端界面...
微信小程序,作为腾讯倾力打造的一款轻量级应用,凭借其独特的优势在移动开发领域崭露头角。它无需下载安装,用户扫一扫或搜一下即可打开应用,体验上更加便捷高效。小程序不仅拥有近似原生App的用户体验,还完美...
1. **微信小程序**:微信小程序是腾讯公司推出的一种轻量级的应用开发框架,它允许开发者在微信内部构建无需下载安装即可使用的应用。微信小程序基于JavaScript、WXML(微信标记语言)和WXSS(微信样式语言)进行...
微信小程序,作为腾讯旗下的轻量级应用平台,凭借其独特的优势和特点,已经深入渗透到人们的生活中。以下是微信小程序的一些关键优势和特点,以及我们为您准备的资源介绍: 优势与特点: 即用即走,无需安装:用户...
微信小程序,作为腾讯倾力打造的一款轻量级应用,凭借其独特的优势在移动开发领域崭露头角。它无需下载安装,用户扫一扫或搜一下即可打开应用,体验上更加便捷高效。小程序不仅拥有近似原生App的用户体验,还完美...
微信小程序,作为腾讯倾力打造的一款轻量级应用,凭借其独特的优势在移动开发领域崭露头角。它无需下载安装,用户扫一扫或搜一下即可打开应用,体验上更加便捷高效。小程序不仅拥有近似原生App的用户体验,还完美...
微信小程序,作为腾讯倾力打造的一款轻量级应用,凭借其独特的优势在移动开发领域崭露头角。它无需下载安装,用户扫一扫或搜一下即可打开应用,体验上更加便捷高效。小程序不仅拥有近似原生App的用户体验,还完美...
微信小程序,作为腾讯倾力打造的一款轻量级应用,凭借其独特的优势在移动开发领域崭露头角。它无需下载安装,用户扫一扫或搜一下即可打开应用,体验上更加便捷高效。小程序不仅拥有近似原生App的用户体验,还完美...