算法练习笔记——栈的常用方法以及算法练习

简介: 算法练习笔记——栈的常用方法以及算法练习

常用方法介绍


     Stack<Character> characters = new Stack<>();
        //判断栈是否为空
        boolean empty = characters.empty();
        //将a压入栈底,同时也返回a
        Character push = characters.push('a');
        //返回栈顶的元素但是并不会删除它
        Character peek = characters.peek();
        //返回栈顶的元素,并将它删除
        Character pop = characters.pop();
        //在堆栈中搜索a,如果发现了,则返回它相对于栈顶
        //的偏移量。否则,返回-1。
        int search = characters.search('a');
        boolean empty1 = characters.isEmpty();


力扣练习


力扣 20. 有效的括号

d2a72980a4ae408caf8a332b00af6581.png

解法一


class Solution {
    Stack<Character> characters = new Stack<>();
    public boolean isValid(String s) {
       char[] chars = s.toCharArray();
       for(int i=0;i<s.length();i++)
       {
        if(chars[i]=='(') characters.push(')');
        else if(chars[i]=='{') characters.push('}');
        else if(chars[i]=='[') characters.push(']');
        else if(characters.isEmpty()||chars[i]!=characters.pop()) return false;
       }
       return characters.isEmpty();                                                                         
    }
}


思路:

利用到了栈的后入先出的特性

利用左半边的进行判断。如果与之对应就将对应的入栈,下次如果不是左边的,就将栈里面的与之比较相同出栈。


力扣 32. 最长有效括号


ff1038da7b604059872df252b5eeb6e0.png

class Solution {
    public int longestValidParentheses(String s) {
        int maxans=0;
        Stack<Integer> stack = new Stack<>();
        stack.push(-1);
        if(s.length()==0||s.length()==1){
            return 0;
        }
        char[] chars = s.toCharArray();
        for(int i=0;i<s.length();i++){
            if(chars[i]=='(') stack.push(i);
            else{
                stack.pop();
                if(stack.isEmpty()){
                     stack.push(i);
                }
                else{
                     maxans = Math.max(maxans, i-stack.peek());
                }
            }
        }
       return maxans;
    }
}


思路分析:

首先我的第一反应是用栈,当遇到(时,将其入栈,遇到)时将栈顶元素弹出,这样可以实现()的匹对

但是需要的是找出记录出长度和找出最长字符串

我们先定义一个maxans 即最长字符串

接下来我们需要找出最长字符串

我们可以先将字符串转为数组,利用其元素下标,求出最长字符串:

思路就是我们可以将元素下标入栈,记录下最后一个不匹配的元素下标,这样两次做差就可以求出,在每一次都用数学函数找出最大的数据记录

由于第一次没有元素我们可以先将-1入栈

相关文章
|
1月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
44 3
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
69 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
25天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
算法 索引
HashMap扩容时的rehash方法中(e.hash & oldCap) == 0算法推导
HashMap在扩容时,会创建一个新数组,并将旧数组中的数据迁移过去。通过(e.hash & oldCap)是否等于0,数据被巧妙地分为两类:一类保持原有索引位置,另一类索引位置增加旧数组长度。此过程确保了数据均匀分布,提高了查询效率。
38 2
|
1月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
54 1
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
67 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
18 1
|
1月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
14 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
32 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
23 0
下一篇
无影云桌面