239. 滑动窗口最大值
这题模拟去写,就是暴力也能写出来,思路很清晰,但是过不了时间要求,而且面试你总归是要优化的,
public int[] maxSlidingWindow(int[] nums, int k) {
int n=nums.length;
int left=0;
int right=k-1;
int[] res=new int[n-k+1];
int j=0;
for(;right<n;right++,left++){
int max=nums[left];
for(int i=left+1;i<=right;i++){
max=Math.max(nums[i],max);
}
res[j++]=max;
}
return res;
}
更改完代码
class MyQueue {
Deque<Integer> deque = new LinkedList<Integer>();
void add(int a) {
//维护队列是从队首到队尾 从大到小的顺序添加的,每次添加的 都从后向前判断,比新的小就poll尾部
while (!deque.isEmpty() && a > deque.getLast()) {
deque.pollLast();
}
deque.add(a);
}
void poll(int a) {
if (!deque.isEmpty() && deque.peek() == a) {
deque.poll();
}
}
int peek() {
return deque.peek();
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
if (n <= 0 || k <= 0) return null;
int len = n - k + 1;
MyQueue myQueue = new MyQueue();
for (int i = 0; i < k; i++) {
myQueue.add(nums[i]);
}
int[] res = new int[n-k+1];
int r=0;
res[r++]=myQueue.peek();
for (int i = k; i < n; i++) {
myQueue.poll(nums[i-k]);
myQueue.add(nums[i]);
res[r++]=myQueue.peek();
}
return res;
}
}
347.前 K 个高频元素
//解法1:基于大顶堆实现
public static int[] topKFrequent1(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();//key为数组元素值,val为对应出现次数
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
//在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数
//出现次数按从队头到队尾的顺序是从大到小排,出现次数最多的在队头(相当于大顶堆)
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]);
for(Map.Entry<Integer,Integer> entry:map.entrySet()){//大顶堆需要对所有元素进行排序
pq.add(new int[]{entry.getKey(),entry.getValue()});
}
int[] ans = new int[k];
for(int i=0;i<k;i++){//依次从队头弹出k个,就是出现频率前k高的元素
ans[i] = pq.poll()[0];
}
return ans;
}