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;
}