LeetCode(剑指offer) Day1

news2024/11/16 4:33:53

1.用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

解题过程记录:本题就是用两个栈,其中一个作为输入栈,另外一个作为输出栈,由于栈的特点是先进后出,有序数字全部进栈然后再出栈会使这个数字序列逆序,然后逆序数字序列再一次经过进栈出栈操作会再次逆序,经过这两次逆序,原本的数字序列的顺序会保持不变,符合队列先进先出的特点。

第一次提交未通过:出队列时,直接把输入栈的数字压入输出栈,忽略了此时输出栈中可能还会有数据,如果输出栈中有数据,序列顺序前后并不符合先进先出的特点。

class CQueue {
     Stack<Integer>s1=null,s2=null;
    public CQueue() {
         s1=new Stack<>();
         s2=new Stack<>();
    }
    
    public void appendTail(int value) {
         s1.push(value);
    }
    
    public int deleteHead() {
         while(!s1.isEmpty()){
            s2.push(s1.pop());
        }
        if (s2.isEmpty()){
            return -1;
        }
        return s2.pop();
    }
}

第二次提交未通过:调用appendTail函数出队列,先判断s1输入栈中是否有数据,如果有并且s2输出栈中为空,将s1的数据全部压入s2输出栈,两栈全为空返回-1。思路混乱错误

class CQueue {
     Stack<Integer>s1=null,s2=null;
    public CQueue() {
         s1=new Stack<>();
         s2=new Stack<>();
    }
    
    public void appendTail(int value) {
         s1.push(value);
    }
    
    public int deleteHead() {
        while(!s1.isEmpty()){
            if(s2.isEmpty()){
                s2.push(s1.pop());
            }
        }
        if (s2.isEmpty()){
            return -1;
        }
        return s2.pop();
    }
}

第三次提交通过: 只有出stack为空的时候,才将进stack的数据全部倒入出stack。

class CQueue {
     Stack<Integer>s1=null,s2=null;
    public CQueue() {
         s1=new Stack<>();
         s2=new Stack<>();
    }
    
    public void appendTail(int value) {
         s1.push(value);
    }
    
    public int deleteHead() {
       if (s2.isEmpty()){
            if(s1.isEmpty()){
                return -1;
            }
            while(!s1.isEmpty()){
                s2.push(s1.pop());
            }
        }
        return s2.pop();
    }
}

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

inStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

解法一:使用主栈s存储数字序列,用一个辅助栈stackTemp同步记录主栈中的最小值。具体来说,当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。

class MinStack {
    /** initialize your data structure here. */
    Stack<Integer> s=null;
    Stack<Integer>stackTemp=null;
    public MinStack() {
        s=new Stack<>();
        stackTemp=new Stack<>();
    }
    
    public void push(int x) {
        s.push(x);
        if(stackTemp.isEmpty()){
            stackTemp.push(x);
        }else{
            stackTemp.push(Math.min(x,stackTemp.peek()));
        }
    }
    
    public void pop() {
        s.pop();
        stackTemp.pop();
    }
    
    public int top() {
        return s.peek();
    }
    
    public int min() {
        return stackTemp.peek();
    }
}

/**
 * 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();
 */

解法二:不使用辅助栈,保留当前最小值和差值,这种方法称为差值法。

解法思路讲解:差值法就是在向栈中插入数据的同时,同步记录并更新栈中的最小值,向栈中插入值x,栈中保存的不再是原值,而是x与最小值的差值即x-min。按照这种思路,push函数如下:

public void push(int x) {
        if (stack.isEmpty()) {
            stack.push(x);
            min = x;//栈为空,插入的第一个值作为当前最小值
        } else {
            stack.push(x - min);//栈不为空,后续插入栈中的值是x-min
            min = Math.min(min, x);//每插入一个新值,需要同步更新最小值
        }
    }
入栈序列523-21
栈实际保存的值5-31-43
当前最小值522-2-2

如果用min记录当前栈中的最小值,用min与栈中的元素进行运算就很容易复原原序列的真实值。通过上面的表格举个例子,入栈序列:5 2 3 -2 1 经过x-min运算存入栈中实际值为 5 -3 1 -4 3。此时栈顶元素为3,是一个整数即x-min>0,也即x>min,说明x不是最小值,如果此时查看栈顶元素,直接返回min+栈顶元素即可复原真实值;但是如果栈顶元素为负数,说明入栈的元素比当前栈中的最小值还要小,那么最小值min就是原值x;还有一种特殊情况,由于我们向栈中插入第一个元素的时候,没有做x-min操作而是直接将真实值插入栈中,并且将它作为最小值,所以当栈中仅有一个元素的时候,栈顶元素=min=真实值。综合上述三种情况,故top函数:

 public int top() {
        if (stack.peek() < 0 || stack.size()==1) {
            return min;
        } else {
            return (min + stack.peek());
        }
    
    }

前面我们分析过,如果当前栈顶元素为正数,说明该元素不与最小值对应,可以直接pop,无需更新min;如果栈顶元素为负数,说明该元素与最小值对应,而且pop出的元素就是最小值,pop出后我们需要确定栈中剩余元素的最小值,假设push该元素的时候插入栈中的值为value,那么value=x-min,公式变形得min=x-value。经过上面的分析,pop函数为:

 public void pop() {
        if (stack.peek() < 0) {
            min = min - stack.pop();
        } else {
            stack.pop();
        }
    }

 我们回看push函数中的一行代码  stack.push(x - min)

 这里题目要求传入的值x是int类型,假设x为Integer.MAX_VALUE,min为Integer.MIN_VALUE,这样x-min运算势必会溢出,因此min需要改为long 类型,相关的算数运算也要在long类型下进行,因此代码优化为:

import java.util.Stack;

public class MinStack {
    Stack<Long> stack = null;
    long min;

    public MinStack() {
        stack = new Stack<>();
    }
    
    public void push(int x) {
        if (stack.isEmpty()) {
            stack.push((long)x);
            min = (long)x;
        } else {
            stack.push((long)(x - min));
            min = Math.min(min, x);
        }
    }
    
    public void pop() {
        if (stack.peek() < 0) {
            min = min - stack.pop();
        } else {
            stack.pop();
        }
    }

    public int top() {
        if (stack.peek() < 0 || stack.size()==1) {
            return (int)min;
        } else {
            return (int)(min + stack.peek());
        }
    
    }

    public int min() {
        return (int)min;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何激励你的内容团队产出更好的创意

对于一个品牌而言&#xff0c;如何创造吸引受众并对受众有价值内容是十分关键的。随着市场数字化的推进&#xff0c;优质的创意和内容输出对一个品牌在市场中有着深远的影响。对于很多内容策划和创作者来说&#xff0c;不断地产出高质量有创意的内容是一件非常有挑战性的事情。…

【零基础入门前端系列】—超链接和文本格式化标签(四)

【零基础入门前端系列】—超链接和文本格式化标签&#xff08;四&#xff09; 一、超链接 HTML使用标签 <a>来设置超文本链接。超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的文…

别再问我供应商质量工程师(SQE)是干什么的了,这是最好的解释。

供应商质量工程师&#xff08;SQE&#xff09;是指一种负责监督供应商质量的职业。SQE的工作主要包括以下几项内容&#xff1a; 核查供应商质量&#xff1a;通过对供应商的产品、服务和生产流程的评估&#xff0c;来确保供应商的质量符合公司的标准和要求。开展质量审核&#…

【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决串口唤醒和回调无法一起使用的问题)

【STM32笔记】HAL库低功耗停止模式的串口唤醒&#xff08;解决串口唤醒时钟问题&#xff09; 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置&#xff08;ADC唤醒无法使用、低功耗模式无法烧录解决方案&#xf…

家政服务小程序实战教程10-分类展示

小程序一般底部菜单栏会有一个分类的功能&#xff0c;点击分类&#xff0c;以侧边栏导航的形式列出所有类目&#xff0c;点击某个类目可以做数据筛选&#xff0c;我们本篇就实现一下该功能 01 优化数据源 在我们家政服务小程序里&#xff0c;我们已经建立了类型和服务的数据源…

企业财务管理升级,智慧税务和数据可视化打造新标准

一、引言在发展社会主义市场经济的过程中&#xff0c;税收承担着组织财政收入、调控经济、调节社会分配的职能。中国每年财政收入的90%以上来自税收&#xff0c;其地位和作用越来越重要&#xff0c;可称之为国家经济的“晴雨表”&#xff0c;有效进行税务管理、充分挖掘税务大数…

面试碰壁15次,作为一个已经28岁的测试工程师,路究竟该怎么走....

3年测试经验原来什么都不是&#xff0c;只是给你的简历上画了一笔&#xff0c;一直觉得经验多&#xff0c;无论在哪都能找到满意的工作&#xff0c;但是现实却是给我打了一个大巴掌&#xff01;事后也不会给糖的那种... 先说一下自己的个人情况&#xff0c;普通二本计算机专业…

深度学习知识补充

候选位置(proposal) RCNN 什么时ROI&#xff1f; 在图像处理领域&#xff0c;感兴趣区域(region of interest &#xff0c; ROI) 是从图像中选择的一个图像区域&#xff0c;这个区域是你的图像分析所关注的重点。圈定该区域以便进行进一步处理。使用ROI圈定你想读的目标&…

dfs(十)矩阵最长递增路径 (注意dfs前后状态的更新)

描述 给定一个 n 行 m 列矩阵 matrix &#xff0c;矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径&#xff0c;使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#xff1a; 1. 对于每个单元格&#xff0c;你可以往上&#…

全解析 ESM 模块语法,出去还是进来都由你说了算

模块语法是ES6的一个重要特性&#xff0c;它的出现让JavaScript的模块化编程成为了可能。 在JavaScript中可以直接使用import和export关键字来导入和导出模块&#xff0c;但是这种语法并不是ES6的标准&#xff0c;而是ESM&#xff08;ECMAScript Module&#xff09;模块语法的…

【CICD】Jenkins 构建部署前端项目

出于对 CICD 的研究与学习&#xff0c;在初步学习了解并安装 jenkins 后&#xff0c;记录一下对于使用 jenkins 部署前端项目的过程。 1.目标 希望能够实现的是&#xff1a;在本地使用 git 工具将项目代码推送到远程仓库&#xff08;本篇使用 gitee 演示&#xff09;&#xf…

[C][KEIL5][IAR] 全局取消结构体对齐

文章目录一、 正常编译&#xff1a;二、 -fpack-struct 全局取消结构体对齐三、 结论&#xff1a;结构体字节不进行对齐的用途&#xff08;1&#xff09;减小内存占用的空间&#xff08;2&#xff09;直接将结构体作为通信协议&#xff08;在低带宽下通讯&#xff09;&#xff…

【Java】代码块的细节你搞懂了吗(基础知识七)

希望像唠嗑一样&#xff0c;one step one futher。 目录 &#xff08;1&#xff09;代码块的应用场景 &#xff08;2&#xff09;代码块的细节 1.static 代码块只加载一次 2.当调用类的静态成员时&#xff0c;类会加载 3. 使用类的静态成员时&#xff0c;static代码块会被执…

大数据第一轮复习笔记

linux: 添加用户 useradd 删除用户 userdel useradd -d指定组 添加组 groupadd 删除组 groupdel 创建目录 mkdir -p 删除目录 rm -rf 创建目录 touch cat -n 查看文件(显示行号)

Axure 9 收录不同效果的制作过程

效果类别 一、默认选中实现单选效果 1、默认选中 点击组件&#xff0c;右键选择selected字样&#xff1b; 2、实现单选效果 点击所有组件&#xff0c;右键选择selected group&#xff0c;填好命名&#xff0c;并设置选中时的组件样式&#xff1b;选择其中一个组件&#xf…

EMQX Cloud Serverless 正式上线:三秒部署、按量计费的 MQTT Serverless 云服务

近日&#xff0c;全球领先的开源物联网数据基础设施软件供应商 EMQ 正式发布了 MQTT Serverless 云服务 —— EMQX Cloud Serverless 的 Beta 版本&#xff0c;开创性地采用弹性多租户技术&#xff0c;用户无需关心服务器基础设施和服务规格伸缩所需资源&#xff0c;仅用三秒即…

十个程序员编程时的简单方法与技巧

你要记住&#xff0c;你写的代码是给人看的 作为一名程序员&#xff0c;希望在你某天离开公司后回想起的若干个开心时刻中&#xff0c;有一个会是因为你面对自己刚刚出炉了一份让自己心动的代码的那份感动&#xff0c;而不要成为上面提到的那个“离开后&#xff0c;公司才知道…

day11_面向对象

今日内容 零、 复习昨日 一、一日一题(数组,OOP) 二、面向对象练习&#xff08;方法参数返回值&#xff09; 三、局部变量&成员变量 四、this关键字 五、构造方法 六、重载 七、封装 小破站同步上课视频: https://space.bilibili.com/402601570/channel/collectiondetail?…

Spring MVC

一、Spring MVC介绍 a. Spring MVC是一个Web框架 b. Spring MVC是基于Servlet API构成的 MVC 是 Model View Controller 的缩写。 MVC 是⼀种思想&#xff0c;⽽ Spring MVC 是对 MVC 思想的具体实现。 学习Spring MVC目标&#xff1a; a.连接功能&#xff1a;将用户&#xff…

JSON学习笔记

♥课程链接&#xff1a;【狂神说Java】一小时掌握JSON_哔哩哔哩_bilibili配套的当然还要学习ajax不管是前端后端&#xff0c;感觉这部分内容是必须的&#xff0c;不然真的做项目的时候云里雾里。总体json的内容不多&#xff0c;具体就&#xff1a;1. 列表、对象等语法格式2. js…