堆栈题总结

hot100

有效的括号

题目链接:
20.有效的括号
代码:

class Solution {
    public boolean isValid(String s) {
        Deque<Character> stack = new LinkedList<>();
        for (int i = 0; i < s.length(); i ++) {
            char ch = s.charAt(i);
            if (ch == '(' || ch == '[' || ch == '{') {
                stack.push(ch);
            }else {
                if (stack.isEmpty()) {
                    return false;
                }
                char ch1 = stack.pop();
                boolean flag1 = ch == ')' && ch1 != '(';
                boolean flag2 = ch == ']' && ch1 != '[';
                boolean flag3 = ch == '}' && ch1 != '{';

                if (flag1 || flag2 || flag3) {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}

最小栈

题目链接:
155.最小栈
代码:

class MinStack {

    Stack<Integer> dataStack;
    Stack<Integer> minStack;
    public MinStack() {
        dataStack = new Stack<>();
        minStack = new Stack<>();
        minStack.push(Integer.MAX_VALUE);

    }

    public void push(int val) {
        dataStack.push(val);
        minStack.push(Math.min(val,minStack.peek()));

    }

    public void pop() {
        dataStack.pop();
        minStack.pop();

    }

    public int top() {
        return dataStack.peek();

    }

    public int getMin() {
        return minStack.peek();

    }
}

字符串解码

题目链接:
394.字符串解码
代码:

class Solution {
    public String decodeString(String s) {
        Deque<Integer> count = new LinkedList<>();
        Deque<String> stack = new LinkedList<>();
        String curr = "";
        int k = 0;

        for (char ch:s.toCharArray()) {
            if (Character.isDigit(ch)) {
                k = k*10 + (ch - '0');
            }else if (ch == '[') {
                count.push(k);
                k = 0;
                stack.push(curr);
                curr = "";
            }else if (ch == ']') {
                StringBuilder tmp = new StringBuilder(stack.pop());
                int repeat = count.pop();
                for (int i = 0; i < repeat; i ++) {
                    tmp.append(curr);
                }
                curr = tmp.toString();
            }else {
                curr += ch;
            }
        }
        return curr;
    }
}

每日温度

题目链接:
739.每日温度
代码:

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] res = new int[n];
        Deque<Integer> stack = new LinkedList<>();
        stack.push(0);

        for (int i = 1; i < n; i ++){
            if (temperatures[i] <= temperatures[stack.peek()])
            {
                stack.push(i);
            }else{
                while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]){
                    res[stack.peek()] = i - stack.peek();
                    stack.pop();
                }
                stack.push(i);
            }
        }
        return res;
    }
}

柱状图中最大的矩形

题目链接:
84.柱状图中最大的矩形
代码:

class Solution {
    public int largestRectangleArea(int[] heights) {
        int n = heights.length;
        int[] newHeights = new int[n + 2];
        newHeights[0] = 0;
        newHeights[n] = 0;
        for (int i = 0; i < n; i ++){
            newHeights[i + 1] = heights[i];
        }
        heights = newHeights;

        int res = 0;

        Deque<Integer> stack = new LinkedList<>();
        stack.push(0);
        for (int i = 1; i < heights.length; i ++){
            if (heights[i] > heights[stack.peek()]){
                stack.push(i);
            }else if (heights[i] == heights[stack.peek()]){
                stack.pop();
                stack.push(i);
            }else{
                while (!stack.isEmpty() && heights[i] < heights[stack.peek()]){
                    int mid = stack.peek();
                    stack.pop();
                    if (!stack.isEmpty()){
                        int left = stack.peek();
                        int w = i - left - 1;
                        res = Math.max(res,w*heights[mid]);
                    }
                }
                stack.push(i);
            }
        }
        return res;
    }
}

hot100

数组中的第k个最大元素

题目链接:
215.数组中的第k个最大元素
代码:

class Solution {
    public void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
    public void maxHeapify(int[] nums, int i, int heapSize){
        int l = 2*i + 1, r = 2*i + 2, large = i;
        if (l < heapSize && nums[l] > nums[large]) {
            large = l;
        }
        if (r < heapSize && nums[r] > nums[large]) {
            large = r;
        }
        if (large != i) {
            swap(nums, i, large);
            maxHeapify(nums, large, heapSize);
        }
    }
    public void buildHeapify(int[] nums, int heapSize) {
        for (int i = heapSize / 2; i >= 0; i --) {
            maxHeapify(nums, i, heapSize);
        }
    }
    public int findKthLargest(int[] nums, int k) {
        int heapSize = nums.length;
        buildHeapify(nums,heapSize);
        for (int i = nums.length - 1; i >= nums.length - k + 1; i --) {
            swap(nums, 0, i);
            heapSize --;
            maxHeapify(nums, 0, heapSize);
        }
        return nums[0];
    }
}

前k个高频元素

题目链接:
347.前k个高频元素
代码:

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();
        for (int num: nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<>() {
            public int compare(Integer o1, Integer o2) {
                return map.get(o1) - map.get(o2);
            }
        });

        for (int entry: map.keySet()) {
            if (pq.size() < k) {
                pq.add(entry);
            }else {
                if (map.get(entry) > map.get(pq.peek())) {
                    pq.remove();
                    pq.add(entry);
                }
            }
        }
        int[] res = new int[k];
        for (int i = 0; i < k; i ++) {
            res[i] = pq.remove();
        }

        return res;

    }
}

数据流的中位数

题目链接:
295.数据流的中位数
代码:

class MedianFinder {

    PriorityQueue<Integer> queMin;
    PriorityQueue<Integer> queMax;

    public MedianFinder() {
        queMin = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });

        queMax = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });


    }

    public void addNum(int num) {

        if (queMin.isEmpty() || num <= queMin.peek())
        {
            queMin.add(num);
            if (queMax.size() + 1 < queMin.size())
            {
                queMax.add(queMin.remove());
            }
        }else
        {
            queMax.add(num);
            if (queMin.size() < queMax.size())
            {
                queMin.add(queMax.remove());
            }
        }

    }

    public double findMedian() {
        if (queMin.size() > queMax.size()) return queMin.peek();
        else return (queMin.peek() + queMax.peek()) / 2.0;

    }
}
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值