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

2024-03-17 06:20

本文主要是介绍力扣爆刷第97天之hot100五连刷71-75,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

文章目录

      • 力扣爆刷第97天之hot100五连刷71-75
      • 一、394. 字符串解码
      • 二、739. 每日温度
      • 三、84. 柱状图中最大的矩形
      • 四、215. 数组中的第K个最大元素
      • 五、347. 前 K 个高频元素

一、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();}
}

二、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;}
}

三、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;}
}

四、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;}}

五、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;}
}

这篇关于力扣爆刷第97天之hot100五连刷71-75的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818083

相关文章

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

71-java 导致线程上下文切换的原因

Java中导致线程上下文切换的原因通常包括: 线程时间片用完:当前线程的时间片用完,操作系统将其暂停,并切换到另一个线程。 线程被优先级更高的线程抢占:操作系统根据线程优先级决定运行哪个线程。 线程进入等待状态:如线程执行了sleep(),wait(),join()等操作,使线程进入等待状态或阻塞状态,释放CPU。 线程占用CPU时间过长:如果线程执行了大量的I/O操作,而不是CPU计算

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height

每日一题,力扣leetcode Hot100之238.除自身以外数组的乘积

乍一看这个题很简单,但是不能用除法,并且在O(N)时间复杂度完成或许有点难度。 考虑到不能用除法,如果我们要计算输出结果位置i的值,我们就要获取这个位置左边的乘积和右边的乘积,那么我新设立两个数组L和R。 对于L来说,由于表达的是位置i左边的数的乘积,那么L[0]=1,因为第一个数字左边没数那么为了不影响乘积初始值就设置为1,那么L[1]=L[0]*nums[0],那么L[i]=L[i-1

力扣 797. 所有可能路径【DFS】

1. 题目 2. 代码 DFS , 直接见代码 class Solution {public:vector<int> path;vector<vector<int>> res; // 结果集void dfs(vector<vector<int>>& graph, int cur, int n){// 找出所有从节点 0 到节点 n-1 的路径// 下标从 0 开始的if (

【Hot100】LeetCode—394. 字符串解码

目录 1- 思路栈实现+四种情况处理 2- 实现⭐394. 字符串解码——题解思路 3- ACM 实现 原题链接:394. 字符串解码 1- 思路 栈实现+四种情况处理 ① 遇到数字,进行倍数相加 、②遇到左括号,压栈之前的元素、③遇到右括号弹出,栈进行拼接、④否则遇到字母,直接拼接在 res通过栈,实现先进后出的思想 对于输入 3[a2[c]] 的输入,在读到 3[得