• 力扣爆刷第97天之hot100五连刷71-75


    力扣爆刷第97天之hot100五连刷71-75

    一、394. 字符串解码

    题目链接:https://leetcode.cn/problems/decode-string/description/?envType=study-plan-v2&envId=top-100-liked
    思路:使用栈进行操作,如果是数字或者字母左括号直接进栈,否则开始出栈,出栈按数子拼接子串即可。

    class Solution {
        int ptr;
    
        public String decodeString(String s) {
            LinkedList<String> stk = new LinkedList<String>();
            ptr = 0;
            while (ptr < s.length()) {
                char cur = s.charAt(ptr);
                if (Character.isDigit(cur)) {
                    String digits = getDigits(s);
                    stk.addLast(digits);
                } else if (Character.isLetter(cur) || cur == '[') {
                    stk.addLast(String.valueOf(s.charAt(ptr++))); 
                } else {
                    ++ptr;
                    LinkedList<String> sub = new LinkedList<String>();
                    while (!"[".equals(stk.peekLast())) {
                        sub.addLast(stk.removeLast());
                    }
                    Collections.reverse(sub);
                    stk.removeLast();
                    int repTime = Integer.parseInt(stk.removeLast());
                    StringBuffer t = new StringBuffer();
                    String o = getString(sub);
                    while (repTime-- > 0) {
                        t.append(o);
                    }
                    stk.addLast(t.toString());
                }
            }
    
            return getString(stk);
        }
    
        public String getDigits(String s) {
            StringBuffer ret = new StringBuffer();
            while (Character.isDigit(s.charAt(ptr))) {
                ret.append(s.charAt(ptr++));
            }
            return ret.toString();
        }
    
        public String getString(LinkedList<String> v) {
            StringBuffer ret = new StringBuffer();
            for (String s : v) {
                ret.append(s);
            }
            return ret.toString();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    二、739. 每日温度

    题目链接:https://leetcode.cn/problems/daily-temperatures/description/?envType=study-plan-v2&envId=top-100-liked
    思路:求某一个数左边或者右边离他最近的一个大于或小于它的数,就使用单调栈,典型单调栈解法。

    class Solution {
       public int[] dailyTemperatures(int[] temperatures) {
            int[] res = new int[temperatures.length];
            Deque<Integer> stack = new LinkedList<>();
            for(int i = 0; i < temperatures.length; i++) {
                while(!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]) {
                    int j = stack.pop();
                    res[j] = i - j;
                }
                stack.push(i);
            }
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    三、84. 柱状图中最大的矩形

    题目链接:https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envType=study-plan-v2&envId=top-100-liked
    思路:典型单调栈,构造凸起,当前元素小于栈顶时,栈顶元素为凸起处,然后出栈,进行计算即可。

    class Solution {
       public int largestRectangleArea(int[] heights) {
            int[] nums = new int[heights.length + 2];
            for(int i = 0; i < heights.length; i++) {
                nums[i+1] = heights[i];
            }
            heights = nums;
            int max = 0;
            Deque<Integer> stack = new LinkedList<>();
            for(int i = 0; i < heights.length; i++) {
                while(!stack.isEmpty() && heights[stack.peek()] > heights[i]) {
                    int mid = stack.pop();
                    int w = i - stack.peek() - 1;
                    int h = heights[mid];
                    max = Math.max(max, w * h);
                }
                stack.push(i);
            }
            return max;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    四、215. 数组中的第K个最大元素

    题目链接:https://leetcode.cn/problems/kth-largest-element-in-an-array/description/?envType=study-plan-v2&envId=top-100-liked
    思路:桶排序,把所有元素分配到桶里,然后倒序遍历数够数直接返回。

    class Solution {
      public int findKthLargest(int[] nums, int k) {
            // 桶排序
            int[] buckets = new int[20001];
            for(int i = 0; i < nums.length; i++) {
                buckets[nums[i] + 10000]++;
            }
            for(int i = buckets.length-1; i > 0; i--) {
                k = k - buckets[i];
                if(k <= 0) {
                    return i - 10000;
                }
            }
            return 0;
        }
        
        
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    五、347. 前 K 个高频元素

    题目链接:https://leetcode.cn/problems/top-k-frequent-elements/description/?envType=study-plan-v2&envId=top-100-liked
    思路:求前k个高频元素,先使用map去记录元素与元素出现的次数,然后使用优先级队列进行排序,最后收集即可。

    class Solution {
        public int[] topKFrequent(int[] nums, int k) {
            int[] res = new int[k];
            PriorityQueue<int[]> queue = new PriorityQueue<>((a, b) -> b[1]-a[1]);
            Map<Integer, Integer> map = new HashMap<>();
            for(int i = 0; i < nums.length; i++) {
                map.put(nums[i], map.getOrDefault(nums[i], 0)+1);
            }
            Set<Integer> set = map.keySet();
            Iterator<Integer> iter = set.iterator();
            for(int i = 0; i < set.size(); i++) {
                int key = iter.next();
                queue.add(new int[]{key, map.get(key)});
            }
            for(int i = 0; i < k; i++) {
                res[i] = queue.poll()[0];
            }
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    d的共享库支持
    【Vue源码分析】Vue3.0的优化
    关于ruoyi(若依)框架的介绍,若依项目的入门,ruoyi(若依)框架的优缺点
    4K视频一分钟大小是多少?如何转换为其他分辨率?
    【每日刷题】Day21
    猿创征文|School StartsFirstProject~UnityVR(HTCVive设备开发)
    分库分表知识点
    关于Jupyter notebook 创建python3 时进去不能重命名问题及不能编程问题
    查看iOS应用的ipa包构建版本6种方法
    postgresql,在pgAdmin中修改列名称和列的类型
  • 原文地址:https://blog.csdn.net/qq_43511039/article/details/136768300