0
点赞
收藏
分享

微信扫一扫

算法训练——栈算法(LeetCodeHOT100)

ZSACH 2023-04-04 阅读 85


摘要

栈相关算法练习

一、算法练习题目

94. 二叉树的中序遍历

package 栈算法;

import java.util.*;

public class inorderTraversal94 {
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        Deque<TreeNode> stk = new LinkedList<TreeNode>();
        // 递归判断
        while (root != null || !stk.isEmpty()) {
            while (root != null) {
                stk.push(root);
                // 递归进左边
                root = root.left;
            }
            //
            root = stk.pop();
            res.add(root.val);
            root = root.right;
        }
        return res;
    }

    public List<Integer> inorderTraversal2(TreeNode root) {
        ArrayList<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        while (root != null || !stack.isEmpty()) {
            while (root != null) {
                stack.add(root);
                root = root.left;
            }
            root = stack.pop();
            // 加入节点数值
            list.add(root.val);
            root = root.right;
        }
        return list;
    }
}

20. 有效的括号

package 栈算法;

import org.junit.Test;

import java.util.HashMap;
import java.util.Stack;

public class isValid20 {
    /**
     * 是否有效
     *
     * @param s
     * @return
     */
    public boolean isValid(String s) {
        HashMap<Character, Character> map = new HashMap<>();
        map.put('}', '{');
        map.put(')', '(');
        map.put(']', '[');

        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '{' || s.charAt(i) == '[' || s.charAt(i) == '(') {
                stack.add(s.charAt(i));
            }else {
                if (!stack.isEmpty() && stack.peek() == map.get(s.charAt(i))) {
                    stack.pop();
                } else {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }

    @Test
    public void test() {
        boolean valid = isValid("([)]");
        System.out.println(valid);

    }
}

155. 最小栈

package 栈算法;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;

public class MinStack155 {
    /**
     * 最小栈
     */

    Stack<Integer> stack;
    public MinStack155() {
        stack=new Stack<Integer>();
    }

    public void push(int val) {
        if (stack.isEmpty()) {
            stack.add(val);
            stack.add(val);
        } else {
            int value=stack.peek();
            if (value>=val){
                stack.add(val);
                stack.add(val);
            }else {
                stack.add(val);
                stack.add(value);
            }
        }
    }

    public void pop() {
        stack.pop();
        stack.pop();
    }

    public int top() {
        int n1=stack.pop();
        int n2=stack.pop();
        stack.add(n2);
        stack.add(n1);
        return n2;
    }

    public int getMin() {
        int tmp=stack.peek();
        return tmp;
    }
}

234. 回文链表

import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;


public class test {

    public class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    /**
     * 判断是否为回文链表 将数据拷贝到数组和list中 在采用的双指针的方式来判断的
     *
     *
     *
     * @param head
     * @return
     */
    public boolean isPalindrome(ListNode head) {
        List<Integer> list = new ArrayList<>();
        while (head != null) {
            list.add(head.val);
            head = head.next;
        }
        int [] arr=new int[list.size()];
        for (int i=0;i<arr.length;i++){
            arr[i]=list.get(i);
        }
        int start = 0;
        int end = list.size() - 1;
        while (start <= end) {
            if (arr[start] != arr[end]) {
                return false;
            }
            start++;
            end--;
        }
        return true;
    }


}

739. 每日温度

package 栈算法;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;

public class dailyTemperatures739V2 {

    /**
     * 构造的单调递增数组
     *
     * @param temperatures
     * @return
     */
    public int[] dailyTemperatures(int[] temperatures) {
        int[] ans = new int[temperatures.length];
        Deque<Integer> stack = new LinkedList<Integer>();
        // stack 存储的是的数组的下标的位置
        for (int i = 0; i < temperatures.length; i++) {
            int temperature = temperatures[i];
            while (!stack.isEmpty() && temperature > temperatures[stack.peek()]) {
                int prevIndex = stack.pop();
                ans[prevIndex] = i - prevIndex;
            }
            stack.push(i);
        }
        return ans;
    }

    @Test
    public void test() {
        int[] ints = dailyTemperatures(new int[]{73, 74, 75, 71, 69, 72, 76, 73});
    }
}

581. 最短无序连续子数组

394. 字符串解码

114. 二叉树展开为链表

32. 最长有效括号

42. 接雨水

84. 柱状图中最大的矩形

85. 最大矩形

博文参考

举报

相关推荐

0 条评论