239.滑动窗口最大值
思路:先写类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个高频元素
思路:用字典收集数组中的元素,之后创建优先级队列(默认小顶堆),小顶堆会优先把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();
}
}