C#代码随想录算法训练营第十三天 | LeetCode239 LeetCode347

239 滑动窗口最大值

题目链接:. - 力扣(LeetCode)

主要思想:

定义了一个单调链表,保证链表的头为最大值,每次进链表的时候,会去判断当前进入的值是否为链表中的最大值,如果是则将前面的元素全部移除。

   private class MyDequeue
   {
       private LinkedList<int> linkedList = new LinkedList<int>();

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

       public int GetMax()
       {
           return linkedList.First.Value;
       }
       public void Dequeue(int n)
       {
           if (linkedList.First.Value == n)
           {
               linkedList.RemoveFirst();
           }
       }
   }
   
   public int[] MaxSlidingWindow(int[] nums, int k)
   {
       MyDequeue myDequeue = new MyDequeue();
       var results = new List<int>();
       for (int i = 0; i < k; i++)
       {
           myDequeue.Enqueue(nums[i]);
       }
       results.Add(myDequeue.GetMax());
       for (int i = k; i < nums.Length; i++)
       {
           myDequeue.Dequeue(nums[i-k]);
           myDequeue.Enqueue(nums[i]);
           results.Add(myDequeue.GetMax());
       }
       return results.ToArray();
   }

347 前K个高频元素

主要思想:用的优先级队列

public int[] TopKFrequent(int[] nums, int k)
{
    Dictionary<int,int> dic=new Dictionary<int,int>();
    foreach (var num in nums)
    {
        if (dic.ContainsKey(num))
        {
            dic[num]++;
        }
        else
        {
            dic.Add(num,1);
        }
    }

    PriorityQueue<int, int> priorityQueue = new PriorityQueue<int, int>();
    foreach (var num in dic)
    {
        priorityQueue.Enqueue(num.Key,num.Value);
        if (priorityQueue.Count>k)
        {
            priorityQueue.Dequeue();
        }
    }

    var results = new int[k];
    for (int i = 0; i < k; i++)
    {
        results[i]=priorityQueue.Dequeue();
    }
    return results;
}

 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值