150. 逆波兰表达式求值
题目链接:力扣题目链接
思路:主要是理解逆波兰表达式是什么意思,就是每单关于到符号就要将数组中符号之前两个值进行计算然后再次放入,用栈取出计算然后放回即可。
239. 滑动窗口最大值
题目链接:力扣题目链接
思路:思路很简单就是维护一个队列,然后每次分噢诶循环,取队列中最大值,但是时间复杂福n*k。
查看题解:使用单调队列,就是一个k大小的队列队列要是一个降序的样子,几种情况,首先队列已满就pop,然后剩下从后向前对比新值与其他值大小,队列中只要小于就移出去,直到岛屿或者为空放入新值,对列第一个就一定是当前k大小队列的最大值。(代码来源“代码随想录”)
public int[] maxSlidingWindow(int[] nums, int k) {
ArrayDeque<Integer> deque = new ArrayDeque<>();
int n = nums.length;
int[] res = new int[n - k + 1];
int idx = 0;
for(int i = 0; i < n; i++) {
while(!deque.isEmpty() && deque.peek() < i - k + 1){
deque.poll();
}
while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.pollLast();
}
deque.offer(i);
if(i >= k - 1){
res[idx++] = nums[deque.peek()];
}
}
return res;
}
347.前 K 个高频元素
题目链接:力扣题目链接
思路:先放入HashMap,然后根觉value值大小排序即可,时间复杂度是n log(n)。n是HashMap中的key数量
查看题解:如果维护一个大小为k的小顶堆时间复杂度就是n log(k)。因为小顶堆更容易溢出最小值所以使用小顶堆。(代码来源“代码随想录”)
public int[] topKFrequent2(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2) -> pair1[1] - pair2[1]);
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (pq.size() < k) {
pq.add(new int[]{entry.getKey(), entry.getValue()});
} else {
if (entry.getValue() > pq.peek()[1]) {
pq.poll();
pq.add(new int[]{entry.getKey(), entry.getValue()});
}
}
}
int[] ans = new int[k];
for (int i = k - 1; i >= 0; i--) {
ans[i] = pq.poll()[0];
}
return ans;
}
时间:2h