首页 > 其他分享 >《剑指offer》day01

《剑指offer》day01

时间:2022-10-07 15:23:51浏览次数:51  
标签:stackHead offer int day01 元素 最小值 复杂度 Stack

用两个栈实现队列

题目要求

image

思路

栈的特性是先进后出,而队列的特性是先进先出,用栈实现队列的话就需要一个辅助栈来逆置原来的栈序列。

代码

class CQueue {

    Stack<Integer> stackTail,stackHead;
    public CQueue() {
        stackTail = new Stack<Integer>();
        stackHead = new Stack<Integer>();
    }
    
    public void appendTail(int value) {
        stackTail.push(value);
    }
    
    public int deleteHead() {
        int result=-1;
        if(stackHead.empty()){
            while(!stackTail.empty()){
                stackHead.push(stackTail.pop());
            }
        }
        if(!stackHead.empty()){
            result=(int)stackHead.pop();
        }
        return result;
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */

复杂度分析

空间复杂度

O(n),原始栈和辅助栈所用的空间大小。

时间复杂度

平均O(n),最好可达O(1),最坏可达O(n)。

反思不足

思路

在出队操作中,最开始是将栈中的所有元素入辅助栈,弹出栈顶元素后,再一次把所有元素压入原来的栈,每次出队操作都这样做。

当时这么想的目的是为了维持顺序不变。

后来发现没必要这样做,将辅助栈的元素全部都出队后再加入后入队的新元素同样可以达到该目的。

java se

对Stack类的有关api不熟悉

image

包含min函数的栈

题目要求

image

思路

相对于传统栈主要在于增加了min函数。

由于栈只能栈顶删除元素或增加元素,所以根据栈顶可以唯一确定当前的最小值,因为无法对栈顶之外的元素进行操作,于是可以通过建立起一个与栈顶变化相对应的最小值序列。那为什么选择栈这一数据结构来实现这个序列呢,因为这个序列的变化在原始栈入栈时在末尾追加元素,在原始栈出栈时,在末尾删除元素。

代码

class MinStack {

    Stack <Integer> stack,minStack;
    int min;
    /** initialize your data structure here. */
    public MinStack() {
        stack = new<Integer> Stack();
        minStack=new<Integer>Stack();
    }
    
    public void push(int x) {
        if(stack.empty()){
            min=x;
        }else if(x<=min){
            min=x;
        }
        stack.push(x);
        minStack.push(min);
    }
    
    public void pop() {
        
        if(!stack.empty()){
            stack.pop();
            minStack.pop();
            min=min();
        }
            
    }
    
    public int top() {
        if(!stack.empty())
            return stack.peek();

        return -1;
    }
    
    public int min() {
        if(!minStack.empty()){
            return minStack.peek();
        }
        return -1;

    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.min();
 */

复杂度分析

空间复杂度

最坏O(n),连续入栈n个元素

时间复杂度

均为O(1)

反思不足

思路

最开始想的是在插入元素时实时的更新最小值就可以了,于是采用了一个整型变量来记录最小值。

此时没有考虑到出栈对最小值的影响。

后面又想到用一个变量来记录上一个最小值,如果出栈元素刚好是最小值,那么就将最小值更新为上一个最小值。

此时没有考虑到可能有重复的最小值元素。而且如果一直出栈的话,上一个最小值如何更新?

看了题解才知道可以构建一个随着出栈、入栈而变化的最小值序列。

标签:stackHead,offer,int,day01,元素,最小值,复杂度,Stack
From: https://www.cnblogs.com/zhouj-learn/p/16759796.html

相关文章

  • LeetCode(剑指 Offer)- 61. 扑克牌中的顺子
    题目链接:​​点击打开链接​​题目大意:略解题思路相关企业字节跳动AC代码Java//解决方案(1)classSolution{publicbooleanisStraight(int[]nums){Set<In......
  • day01
    markdown学习标题一级标题(#空格标题名字)二级标题(##空格标题名字)三级以下类推逐加#回车即可字体斜体:字体俩边加1星号(eg:hello)粗体:字体俩边加2星号(eg:hello)即粗又斜:......
  • 剑☞offer 两个链表的第一个公共节点
    题目描述:给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目数据 保证 整个链式结构中不存......
  • Three.js day01
    `<head><metacharset="UTF-8"><title>第一个three.js文件_WebGL三维场景</title><style>body{margin:0;overflow:hidden;/*隐......
  • 力扣剑指offer——二叉树篇
    ✔✨前言......
  • c++learningDay01
    c++大学习头文件#include"complex.h"头文件的格式:防卫声明#ifndef__COMPLEX__#define__COMPLEX__​...​#endif  头文件由三个大部分构成#ifndef__COMPL......
  • 代码随想录day8 ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 05.替换空
    344.反转字符串1classSolution{2public:3voidreverseString(vector<char>&s){4for(inti=0,j=s.size()-1;i<s.size()/2;i++......
  • day01-数据库的安装和使用
    Java数据库的安装和使用1.数据库的作用一个问题:淘宝网、京东、微信抖音,都有各自的功能,那么我们退出系统的时候,为什么信息还在?解决之道-文件,数据库为了解决上诉问题,使用......
  • LeetCode剑指 Offer II 093 最长斐波那契数列
    LeetCode剑指OfferII093最长斐波那契数列classSolution:deflenLongestFibSubseq(self,arr:List[int])->int:n,loc,ans=len(arr),{},0......
  • JavaWeb基础day01_XML
    一、XMLXML文件的默认打开方式是浏览器xml:是可扩展的标记语言ExtensibleMarkupLanguage。以一种标签语言与HTML类似1、xml的作用编写配置文件:C3P0编写XML配置文件做数据......