算法解析-经典150(区间、栈)

文章目录

  • 区间
    • 1.汇总区间
        • 1.答案
        • 2.思路
    • 2.合并区间
        • 1.答案
        • 2.思路
    • 3.插入区间
        • 1.答案
        • 2.思路
    • 4.用最少数量的箭引爆气球
        • 1.答案
        • 2.思路
    • 1.有效的括号
        • 1.答案
        • 2.思路
    • 2.简化路径
        • 1.答案
        • 2.思路
    • 3.最小栈
        • 1.答案
        • 2.思路
    • 4.逆波兰表达式求值
        • 1.答案
        • 2.思路

区间

1.汇总区间

1.答案
package com.sunxiansheng.classic150.g1;import java.util.ArrayList;
import java.util.List;/*** Description: 228. 汇总区间** @Author sun* @Create 2024/12/23 13:31* @Version 1.0*/
public class t228 {public static List<String> summaryRanges(int[] nums) {List<String> res = new ArrayList<>();if (nums == null || nums.length == 0) {return res;}// 滑动窗口定义:窗口内的元素需要是连续的int left = 0;for (int right = 0; right < nums.length; right++) {// 加入窗口// 如果发现是不连续的if (right > 0 && nums[right] != nums[right - 1] + 1) {extracted(nums, right, left, res);// 滑动窗口left = right;}}// 对最后一个元素进行操作extracted(nums, nums.length, left, res);return res;}private static void extracted(int[] nums, int right, int left, List<String> res) {// 合法的窗口右下标int wRight = right - 1;// 计算合法窗口元素int count = wRight - left + 1;// 构造结果String element = "";if (count == 1) {// 只有一个元素结果就是这个元素element = String.valueOf(nums[wRight]);} else {// 如果有多个元素,就需要拼接StringBuilder sb = new StringBuilder();sb.append(nums[left]);sb.append("->");sb.append(nums[wRight]);element = sb.toString();}// 添加到结果res.add(element);}public static void main(String[] args) {System.out.println("summaryRanges(new int[]{0,1,2,4,5,7}) = " + summaryRanges(new int[]{0,1,2,4,5,7}));}
}
2.思路

就是使用滑动窗口,窗口内的元素需要是连续的,当发现不合法时,对有一个元素和两个元素进行分别处理即可,并且最后一段需要单独处理

2.合并区间

1.答案
package com.sunxiansheng.classic150.g1;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;/*** Description: 56. 合并区间** @Author sun* @Create 2024/12/23 17:20* @Version 1.0*/
public class t56 {public static int[][] merge(int[][] intervals) {// 【1,6】【2,5】【3,4】【100,200】// 按照数组的第一个元素进行排序Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));List<int[]> list = new ArrayList<>();// 记录当前合并的数组int[] cur = new int[2];cur[0] = intervals[0][0];cur[1] = intervals[0][1];// 遍历二维数组for (int i = 1; i < intervals.length; i++) {// 能合就合并if (intervals[i][0] <= cur[1]) {cur[1] = Math.max(cur[1], intervals[i][1]);} else {// 不能合并就记录结果,并更新curlist.add(new int[]{cur[0], cur[1]});cur[0] = intervals[i][0];cur[1] = intervals[i][1];}}// 记录最后一个元素的结果list.add(new int[]{cur[0], cur[1]});return list.toArray(new int[0][0]);}
}
2.思路

使用一个临时变量去记录前一个合并后的数组,然后遍历二维数组,如果能合并就合并,不能合并就记录结果并更新cur

3.插入区间

1.答案
package com.sunxiansheng.classic150.g1;import java.util.ArrayList;
import java.util.List;/*** Description: 57. 插入区间** @Author sun* @Create 2024/12/23 18:27* @Version 1.0*/
public class t57 {public static int[][] insert(int[][] intervals, int[] newInterval) {if (intervals == null || intervals.length == 0) {int[][] res = new int[1][2];res[0] = newInterval;return res;}//【1,5】【0,3】int[][] newArr = null;// 寻找插入位置if (intervals[0][0] >= newInterval[0]) {newArr = new int[intervals.length + 1][2];newArr[0] = newInterval;for (int i = 0; i < intervals.length; i++) {newArr[i + 1] = intervals[i];}} else {int index = -1;for (int i = 0; i < intervals.length; i++) {if (i == intervals.length - 1 && index == -1) {index = i;break;}if (newInterval[0] >= intervals[i][0] && newInterval[0] <= intervals[i + 1][0]) {index = i;break;}}// 新数组newArr = new int[intervals.length + 1][2];for (int i = 0; i <= index; i++) {newArr[i] = intervals[i];}newArr[index + 1] = newInterval;if (index + 1 != newArr.length - 1) {for (int i = index + 1; i < intervals.length; i++) {newArr[i + 1] = intervals[i];}}}int[][] res = getInts(newArr);return res;}private static int[][] getInts(int[][] newArr) {// 对新数组进行合并区间List<int[]> list = new ArrayList<>();// 记录当前合并的数组int[] cur = new int[2];cur[0] = newArr[0][0];cur[1] = newArr[0][1];// 遍历二维数组for (int i = 1; i < newArr.length; i++) {// 能合就合并if (newArr[i][0] <= cur[1]) {cur[1] = Math.max(cur[1], newArr[i][1]);} else {// 不能合并就记录结果,并更新curlist.add(new int[]{cur[0], cur[1]});cur[0] = newArr[i][0];cur[1] = newArr[i][1];}}// 记录最后一个元素的结果list.add(new int[]{cur[0], cur[1]});int[][] res = list.toArray(new int[0][0]);return res;}public static void main(String[] args) {insert(new int[][]{{1, 5},}, new int[]{0, 3});}
}
2.思路

就是先插入到指定位置然后再对新数组进行合并区间

4.用最少数量的箭引爆气球

1.答案
package com.sunxiansheng.classic150.g1;import java.util.Arrays;
import java.util.Comparator;/*** Description: 452. 用最少数量的箭引爆气球** @Author sun* @Create 2024/12/24 08:46* @Version 1.0*/
public class t452 {public static int findMinArrowShots(int[][] points) {if (points.length == 1) {return 1;}// 首先根据数组的第一个元素进行从小到大的排序Arrays.sort(points, Comparator.comparingInt(a -> a[0]));int res = 0;// 记录前一个交集int[] prev = new int[2];prev[0] = points[0][0];prev[1] = points[0][1];// 遍历,有交集就求交集for (int i = 1; i < points.length; i++) {// 有交集if (points[i][0] <= prev[1]) {prev[0] = Math.max(prev[0], points[i][0]);prev[1] = Math.min(prev[1], points[i][1]);} else {// 没有交集,就记录结果res++;// 然后更新一下前一个交集为当前交集prev = points[i];}}// 需要将res加一,因为少算了最后一个结果return ++res;}
}
2.思路

就是跟合并区间类似的思路,不过这次换成了求交集而已

1.有效的括号

1.答案
package com.sunxiansheng.classic150.g1;import java.util.Stack;/*** Description: 20. 有效的括号** @Author sun* @Create 2024/12/24 09:19* @Version 1.0*/
public class t20 {public static boolean isValid(String s) {// 左括号入栈,右括号匹配Stack<Character> stack = new Stack<>();// 遍历一下for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);// 左括号入栈if (c == '[' || c == '(' || c == '{') {stack.push(c);}// 右括号匹配if (c == ']' || c == ')' || c == '}') {// 如果栈为空,直接直接返回falseif (stack.isEmpty()) {return false;}// 栈不为空就匹配if (!match(stack.pop(), c)) {return false;}}}// 如果循环结束并且栈为空,就返回truereturn stack.isEmpty();}private static boolean match(Character characterA, Character characterB) {if (characterA == '(' && characterB != ')') {return false;}if (characterA == '[' && characterB != ']') {return false;}if (characterA == '{' && characterB != '}') {return false;}return true;}
}
2.思路

左括号入栈,右括号匹配,注意栈空的情况

2.简化路径

1.答案
package com.sunxiansheng.classic150.g1;import java.util.Arrays;
import java.util.Stack;/*** Description: 71. 简化路径** @Author sun* @Create 2024/12/24 09:28* @Version 1.0*/
public class t71 {public static String simplifyPath(String path) {// 以 / 进行分割String[] split = path.split("/+");System.out.println("split = " + Arrays.toString(split));Stack<String> stack = new Stack<>();// 遍历for (int i = 1; i < split.length; i++) {stack.push(split[i]);// 如果只包含点,就判断有几个点,有几个点就pop几次if (split[i].matches("\\.+")) {int length = split[i].length();// 如果length小于3才要popif (length < 3) {for (int j = 0; j < length; j++) {// 如果发现了栈都空了还pop,就直接breakif (stack.isEmpty()) {break;}stack.pop();}}}}// 如果目前栈就已经是空的了直接返回 /if (stack.isEmpty()) {return "/";}// 进行结果的拼接String s = putTogether(stack);return s;}/*** 递归拼接结果** @param stack* @return*/private static String putTogether(Stack<String> stack) {// 直到栈为空if (stack.isEmpty()) {return "";}// popString pop = stack.pop();String s = putTogether(stack);return s + "/" + pop;}public static void main(String[] args) {String s = simplifyPath("/../..ga/b/.f..d/..../e.baaeeh./.a");System.out.println("s = " + s);}
}
2.思路

思路很复杂,根据题意调试

3.最小栈

1.答案
package com.sunxiansheng.classic150.g1;import java.util.Stack;/*** Description: 155. 最小栈** @Author sun* @Create 2024/12/24 10:26* @Version 1.0*/
public class MinStack {// 一个最小栈一个辅助栈Stack<Integer> minStack;Stack<Integer> stack;public MinStack() {minStack = new Stack<>();stack = new Stack<>();// 最小栈先要加入一个最大的元素minStack.push(Integer.MAX_VALUE);}public void push(int val) {// 压栈压最小stack.push(val);minStack.push(Math.min(minStack.peek(), val));}public void pop() {// pop都出去stack.pop();minStack.pop();}public int top() {return stack.peek();}public int getMin() {return minStack.peek();}
}
2.思路

压栈压最小,pop都出去

4.逆波兰表达式求值

1.答案
package com.sunxiansheng.classic150.g1;import java.util.Stack;/*** Description: 150. 逆波兰表达式求值** @Author sun* @Create 2024/12/24 10:48* @Version 1.0*/
public class t150 {public static int evalRPN(String[] tokens) {// 数字压栈,表达式求值Stack<Integer> stack = new Stack<>();for (int i = 0; i < tokens.length; i++) {if (isDigit(tokens[i])) {stack.push(Integer.valueOf(tokens[i]));} else {// 求值Integer right = stack.pop();Integer left = stack.pop();switch (tokens[i]) {case "+":stack.push(left + right);break;case "-":stack.push(left - right);break;case "*":stack.push(left * right);break;case "/":stack.push(left / right);break;default:break;}}}return stack.pop();}// 判断是否是数字private static boolean isDigit(String s) {return !"+".equals(s) && !"-".equals(s) && !"*".equals(s) && !"/".equals(s);}
}
2.思路

数字压栈,表达式求值

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「Mac畅玩鸿蒙与硬件54」UI互动应用篇31 - 滑动解锁屏幕功能

本篇教程将实现滑动解锁屏幕功能&#xff0c;通过 Slider 组件实现滑动操作&#xff0c;学习事件监听、状态更新和交互逻辑的实现方法。 关键词 滑动解锁UI交互状态管理动态更新事件监听 一、功能说明 滑动解锁屏幕功能包含以下功能&#xff1a; 滑动解锁区域&#xff1a;用…

电子应用设计方案86:智能 AI背景墙系统设计

智能 AI 背景墙系统设计 一、引言 智能 AI 背景墙系统旨在为用户创造一个动态、个性化且具有交互性的空间装饰体验&#xff0c;通过融合先进的技术和创意设计&#xff0c;提升室内环境的美观度和功能性。 二、系统概述 1. 系统目标 - 提供多种主题和风格的背景墙显示效果&…

基于物联网疫苗冷链物流监测系统设计

1. 项目开发背景 随着全球对疫苗运输要求的提高&#xff0c;特别是针对温度敏感型药品&#xff08;如疫苗&#xff09;的冷链管理&#xff0c;如何保证疫苗在运输过程中的温度、湿度、震动等环境因素的稳定性已成为亟需解决的问题。疫苗运输过程中&#xff0c;任何温度或湿度的…

Trimble天宝X9三维扫描仪为建筑外墙检测提供了全新的解决方案【沪敖3D】

随着城市化进程的快速推进&#xff0c;城市高层建筑不断增多&#xff0c;对建筑质量的要求也在不断提高。建筑外墙检测&#xff0c;如平整度和垂直度检测&#xff0c;是衡量建筑质量的重要指标之一。传统人工检测方法不仅操作繁琐、效率低下&#xff0c;还难以全面反映墙体的真…

瑞吉外卖项目学习笔记(十)修改套餐、删除套餐、起售和停售套餐

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…

Python 实时获取Linux服务器信息

在进行服务器监控、运维管理时&#xff0c;实时获取服务器信息至关重要。特别是在 Linux 环境下&#xff0c;我们常常需要获取系统的运行状态、资源占用情况以及硬件信息。如果你是运维人员、开发者或是正在做自动化运维任务的人&#xff0c;那么如何高效地实时获取 Linux 服务…

MATLAB程序转C# WPF,dll集成,混合编程

工作中遇到一个需求&#xff0c;有一部分算法的代码需要MATLAB来进行处理&#xff0c;而最后需要集成到C#中的wpf项目中去&#xff0c;选择灵活性更高的dll&#xff0c;去进行集成。&#xff08;可以简单理解为&#xff1a;将MATLAB的函数&#xff0c;变为C#中类的函数成员&…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

深入理解 pytest Fixture 方法及其应用

在 Python 自动化测试领域&#xff0c;pytest 是当之无愧的王者。提到 pytest&#xff0c;不得不说它的一大核心功能——Fixture。Fixture 的强大&#xff0c;让复杂的测试流程变得井井有条&#xff0c;让测试代码更加灵活和可复用。 那么&#xff0c;pytest 的 Fixture 究竟是…

【AI编辑器】Cursor与DeepSeek模型的集成:提升开发效率的新选择

目录 一、为什么选择DeepSeek模型 1.1 模型参数与训练 1.2 技术创新 1、FP8格式介绍 2、FP8混合精度训练的优势 3、FP8混合精度训练的技术要点 4、FP8混合精度训练的应用与挑战 1.3 性能表现 1.4 应用与部署 1.5 争议与前景 二、注册DeepSeek账号并获取API Key 三、…

什么情况会导致JVM退出?

大家好&#xff0c;我是锋哥。今天分享关于【什么情况会导致JVM退出?】面试题。希望对大家有帮助&#xff1b; 什么情况会导致JVM退出? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java Virtual Machine&#xff09;在不同情况下可能会退出&am…

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计

一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段&#xff0c;要设计软件体系结构&#xff0c;即是确定软件系统中每个程序是由哪些模块组成的&#xff0c;以及这些模块相互间的关系。同时把模块组织成良好的层次系统&#xff1a;顶层模块通过调用它的下层…

《Rust权威指南》学习笔记(三)

泛型和trait 1.泛型可以提高代码的复用能力&#xff0c;泛型是具体类型或其他属性的抽象代替&#xff0c;可以看成是一种模版&#xff0c;一个占位符&#xff0c;编译器在编译时会将这些占位符替换成具体的类型&#xff0c;这个过程叫做“单态化”&#xff0c;所以使用泛型的…

计算机网络基础(7)中科大郑铨老师笔记

应用层 目标&#xff1a;  网络应用的 原理&#xff1a;网络应用协议的概念和实现方面 传输层的服务模型 客户-服务器模式 对等模式(peerto-peer) 内容分发网络  网络应用的 实例&#xff1a;互联网流行的应用层协 议  HTTP  FTP  SMTP / POP3 / IMAP  DNS…

2022浙江大学信号与系统笔记

原视频地址&#xff1a;2022浙江大学信号与系统&#xff08;含配套课件和代码&#xff09; - 胡浩基老师-哔哩哔哩 ⭐⭐⭐ 我的笔记&#xff1a;飞书链接 - 信号与系统 基于视频&#xff0c;记得笔记&#xff0c;加了点自己的补充&#xff08;有的是问 ChatGPT 的&#xff09;…

数学建模入门——建模流程

摘要&#xff1a;本文介绍了数学建模的一般流程概述。 目录 一、前言 二、数据预处理 三、描述性统计分析 四、模型建立 五、模型评价 一、前言 本文将为想要入门数学建模的同学讲述数学建模的一般流程。但数学建模流程并非一成不变。虽有大致步骤&#xff0c;像分析问题、…

如何使用OpenCV进行抓图-多线程

前言 需求&#xff1a; 1、如何使用OpenCV捕抓Windows电脑上USB摄像头的流、 2、采用多线程 3、获知当前摄像头的帧率。 这个需求&#xff0c;之前就有做了&#xff0c;但是由于出现了一个问题&#xff0c;人家摄像头的帧率目前都可以达到60帧/s 了&#xff0c;而我的程序…

NLP CH3复习

CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降&#xff08;GD&#xff09; 全批量&#xff1a;在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…

01 数据分析介绍及工具准备

数据分析介绍及工具准备 一、工具准备二、下载和使用Anaconda三、jupyter notebook常用快捷键 一、工具准备 数据科学库 NumPy&#xff0c;SciPy&#xff0c;Pandas&#xff0c;Scikit-Learn 数据可视化库 Matplotlib&#xff0c;Seaborn 编译器 Jupyter Notebook 数据科…

机组的概述

计算机系统组成 硬件系统和软件系统 计算机硬件 1.冯诺依曼机基本思想 特点 1.采用“存储程序”工作方式 2.硬件系统由运算器&#xff0c;存储器&#xff0c;控制器&#xff0c;输入输出设备组成 3.指令和数据存在存储器中&#xff0c;形式无区别 4.指令和数据用二进制代…