代码随想录算法训练营第十二天

239.滑动窗口最大值

239. 滑动窗口最大值 - 力扣(LeetCode)

思路:先写类MyQueue,函数Enqueue,实现当压入值比队列中最后一个元素大时,就移除队列末尾元素,直到队列没有元素或者队列末尾元素大于压入值跳出,并把压入值加入到队列末尾;函数Dequeue,功能是当队列中的Count已经到K值,则移除队列中的第一个元素,使压入值能加入到队列末尾;函数Max,输出队列最大值。

先循环数组前K值到队列中,其中每次循环压入值比队列的末尾元素大就移除。之后从k开始循环数组,先跑Dequeue,就是判断队列首元素是不是和循环内的(i-k)索引的值是否相同,相同表示队列已经满了,要删除队列首元素;再跑Enqueue,最后取队列最大值并加入到list中。最后就返回list。

C#代码:

    public class MyQueue
    {
        private LinkedList<int> list = new LinkedList<int>();

        public void Enqueue(int i)
        {
            while(list.Count > 0 && list.Last.Value < i)
            {
                list.RemoveLast();
            }
            list.AddLast(i);
        }

        //相当于队列满足要求K值时,数组刚好指向队列的首元素,然后就可以移除
        public void Dequeue(int i)
        {
            if (list.First.Value == i)
            {
                list.RemoveFirst();
            }
        }

        public int Max()
        {
            return list.First.Value;
        }
    }

public class Solution {
    public int[] MaxSlidingWindow(int[] nums, int k) {
        MyQueue myQueue = new MyQueue();
        List<int> mylist = new List<int>();

        for(int i=0;i<k;i++){myQueue.Enqueue(nums[i]);}
        mylist.Add(myQueue.Max());

        for(int i=k;i<nums.Length;i++){
            myQueue.Dequeue(nums[i-k]);
            myQueue.Enqueue(nums[i]);
            mylist.Add(myQueue.Max());
        }
        return mylist.ToArray();
    }
}

347.前K个高频元素

347. 前 K 个高频元素 - 力扣(LeetCode)

思路:用字典收集数组中的元素,之后创建优先级队列(默认小顶堆),小顶堆会优先把value较小的值排在队列末尾,如果队列Count等于k+1,就移除队列末尾,直到循环结束,结束后再输出给list排列返回toarray。(大顶堆:PriorityQueue<int,int>pq = new PriorityQueue<int ,int>((x, y) => y.CompareTo(x));)

(关于优先级队列的文章:PriorityQueue<TElement,TPriority> 类 (System.Collections.Generic) | Microsoft Learn大顶堆,小顶堆_这瓜保熟么的博客-CSDN博客

C#代码:

public class Solution {
    public int[] TopKFrequent(int[] nums, int k) {
        Dictionary<int,int> dict = new Dictionary<int,int>();
        for(int i=0;i<nums.Length;i++){
            if(dict.ContainsKey(nums[i])){dict[nums[i]]++;}
            else{
                dict.Add(nums[i],1);
            }
        }
        PriorityQueue<int,int>pq = new PriorityQueue<int,int>();
        foreach(var kv in dict){
            pq.Enqueue(kv.Key,kv.Value);
            if(pq.Count == k + 1){
                pq.Dequeue();
            }
        }
        var res = new List<int>();
        while(pq.Count > 0){
            res.Add(pq.Dequeue());
        }
        return res.ToArray();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值