LeeCode Practice Journal | Day11_Stack & Queue02

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

堆的相关知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值