LeetCode hot 100 解题思路记录(三)
前情提要
本文是个人学习的粗糙笔记,仅记录思路和图解(跳过了困难题,等之后再弄)
视频看的是油管上的neetcode
栈
有效的括号(简单)
后进先出:左括号入栈,有对应右括号则出栈
代码主要步骤:遍历字符串,若是左括号则压入栈,若是右括号检查是否匹配
if (pairs.containsKey(ch)) { // 如果当前字符是右括号// 检查栈是否为空,或者栈顶元素是否不匹配if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {return false; // 不匹配,直接返回false}stack.pop();// 匹配成功,弹出栈顶的左括号} else {stack.push(ch);// 当前字符是左括号,压入栈中}
最小栈
加了一个辅助的最小值栈,栈是先进后出
push()
xStack.push(x); // 将值压入主栈
// 将当前值与辅助栈顶的最小值比较,压入更小的那个
// 这样辅助栈每个位置都记录着主栈对应位置及以下的最小值
minStack.push(Math.min(minStack.peek(), x));
pop()
xStack.pop(); // 弹出主栈顶部的值
minStack.pop(); // 同时弹出辅助栈顶部的值(保持两个栈同步)
top(): peek()
getMin(): peek()
字符串解码
3[a2[c]]
步骤 栈状态 操作
1 [3] 遇到数字3
2 [3, [, a] 遇到[和a
3 [3, [, a, 2] 遇到数字2
4 [3, [, a, 2, [, c] 遇到[和c
5 [3, [, a, "cc"] 遇到],解码2[c]得到"cc"
6 ["acc"] 遇到],解码a+"cc"得到"acc"
7 ["accccaccccacccc"] 解码3["acc"]得到最终结果
使用栈来处理括号嵌套结构
三种情况处理: 数字:提取完整数字压栈
字母或左括号:直接压栈
右括号:开始解码过程
解码过程:stk链表弹出直到左括号,获取要重复的字符串,创建临时链表sub来存储要重复字符串
stk弹出左括号
stk弹出重复次数
sub反转后构建重复后的字符串并压回栈中
每日温度
代码中的stack存储的不是具体的温度值,而是temprature数组里的具体索引
柱状图中最大的矩形(困难)
堆
数组中的第K个最大元素
QuickSelect,最大堆能保证堆顶数字是最大值,每次堆大小减一即可找到第K个最大元素
算法流程:先构建最大堆
然后进行k-1次操作: 将堆顶最大值交换到数组末尾、堆大小减1、重新调整堆
最后堆顶就是第k大的元素
// 调整最大堆:确保以i为根的子树满足最大堆性质public void maxHeapify(int[] a, int i, int heapSize) {int l = i * 2 + 1; // 左子节点索引int r = i * 2 + 2; // 右子节点索引int largest = i; // 假设当前节点是最大的// 如果左子节点存在且大于当前节点if (l < heapSize && a[l] > a[largest]) {largest = l;} // 如果右子节点存在且大于当前最大值if (r < heapSize && a[r] > a[largest]) {largest = r;}// 如果最大值不是当前节点,需要交换并继续调整if (largest != i) {swap(a, i, largest); // 交换当前节点和最大值节点maxHeapify(a, largest, heapSize); // 递归调整受影响的子树}}
前K个高频元素
使用的数据结构: HashMap:用于统计每个数字的出现频率
最小堆(PriorityQueue):维护前k个高频元素
示例详细过程如下:
数字: [1,1,1,2,2,3,3,4,4,4,4], k=2
步骤一,频率统计: {1:3, 2:2, 3:2, 4:4}
步骤二,构建最小堆,容量为2
步骤三,堆操作: 加入[1,3] -> 堆: [[1,3]]
加入[2,2] -> 堆: [[2,2], [1,3]](堆顶[2,2])
加入[3,2]: 2=2,不替换 -> 堆不变
加入[4,4]: 4>2,替换 -> 堆: [[1,3], [4,