150.逆波兰表达式
题目:150. 逆波兰表达式求值 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
思路清晰但细节上犯了很多错误
solution
public class Solution {
public int EvalRPN(string[] tokens) {
Stack<int> stack = new Stack<int>();
for(int i = 0; i < tokens.Length; i ++)
{
switch(tokens[i])
{
case "+":
stack.Push(stack.Pop() + stack.Pop());
break;
case "-":
stack.Push(-(stack.Pop() - stack.Pop()));
break;
case "*":
stack.Push(stack.Pop() * stack.Pop());
break;
case "/":
int n = stack.Pop();
int m = stack.Pop();
stack.Push(m / n);
break;
default:
stack.Push(int.Parse(tokens[i]));
break;
}
}
return stack.Pop();
}
}
summary
错误:
1、输入参数是string[],进栈时要没有转换成整数
2、“/”的情况,注意先后顺序,不能用1/stack.Pop()/stack.Pop()得到,除数可能为0
3、case少写break
239.滑动窗口最大值
题目:239. 滑动窗口最大值 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
对优先级队列、双端队列等基础知识不了解
这题记住用双端队列和单调队列的思想去做,具体操作只能每次自己想了
solution
public class Solution {
public int[] MaxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.Length == 0) return new int[0];
List<int> result = new List<int>();
LinkedList<int> dequeue = new LinkedList<int>();
for(int i = 0; i < nums.Length; i ++)
{
//检查队头元素是否溢出
if(dequeue.Count > 0 && dequeue.First.Value <= i - k) dequeue.RemoveFirst();
//加入当前元素,并按大小关系当前保证滑动窗口最大元素保持在队头,且队头到队尾单调递减
while(dequeue.Count > 0 && nums[dequeue.Last.Value] <= nums[i]) dequeue.RemoveLast();
dequeue.AddLast(i);
//当满足滑动窗口时,每次遍历结果加入队头元素
if(i >= k - 1) result.Add(nums[dequeue.First.Value]);
}
return result.ToArray();
}
}
summary
关于双端队列 Double-Ended Queue
1、概念:
是一种支持在两端进行插入和删除操作的数据结构
2、特性:
双端操作;
动态调整(动态调整容量,根据需求增加或减少);
有序性:保持元素的插入顺序,支持两端进行遍历
3、实现:
可以基于多种数据结构实现,例如数组,链表等
4、使用场景:
滑动窗口:解决滑动窗口问题,如滑动窗口最大值
调度系统:用于任务调度,允许在两端添加和删除任务
回溯算法:用于实现回溯算法中的状态储存
缓存系统
347.前K个高频元素
题目:347. 前 K 个高频元素 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
solution
public class Solution {
public int[] TopKFrequent(int[] nums, int k) {
// Step 1: Calculate the frequency of each element
Dictionary<int, int> frequencyMap = new Dictionary<int, int>();
foreach (int num in nums) {
if (frequencyMap.ContainsKey(num)) {
frequencyMap[num]++;
} else {
frequencyMap[num] = 1;
}
}
// Step 2: Use a min heap to keep track of the top k elements
var minHeap = new SortedDictionary<int, Queue<int>>();
foreach (var pair in frequencyMap) {
if (!minHeap.ContainsKey(pair.Value)) {
minHeap[pair.Value] = new Queue<int>();
}
minHeap[pair.Value].Enqueue(pair.Key);
if (minHeap.Sum(x => x.Value.Count) > k) {
var first = minHeap.First();
first.Value.Dequeue();
if (first.Value.Count == 0) {
minHeap.Remove(first.Key);
}
}
}
// Step 3: Extract the elements from the heap
List<int> result = new List<int>();
foreach (var pair in minHeap) {
foreach (var num in pair.Value) {
result.Add(num);
}
}
return result.ToArray();
}
}
summary
堆的相关知识

747

被折叠的 条评论
为什么被折叠?



