239. 滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
示例 2:
输入:nums = [1], k = 1
输出:[1]
public class Leetcode239 {
public static void main(String[] args) {
int[] nums = {1, 3, -1, -3, 5, 3, 6, 7};
int k = 3;
int[] ints = maxSlidingWindow(nums, k);
Arrays.stream(ints).forEach(s -> System.out.print(s + " "));
}
public static int[] maxSlidingWindow(int[] nums, int k) {
int length = nums.length;
if (length < 2) {
return nums;
}
MyQueue myQueue = new MyQueue();
//加入前 k个元素
for (int i = 0; i < k; i++) {
myQueue.add(nums[i]);
}
int[] res = new int[length - k + 1];
// res 元素个数
int num = 0;
res[num++] = myQueue.getMax();
for (int i = k; i < length; i++) {
myQueue.add(nums[i]);
myQueue.pop(nums[i-k]);
res[num++] = myQueue.getMax();
}
return res;
}
}
class MyQueue {
Deque<Integer> deque = new LinkedList<>();
/**
* 添加元素
*
* @param x x
*/
void add(Integer x) {
// 保证添加的元素都比队尾元素大
while (!deque.isEmpty() && deque.getLast() < x) {
deque.removeLast();
}
deque.add(x);
}
/**
* 移除元素
*
* @param x x
*/
void pop(Integer x) {
if (deque.getFirst().equals(x)) {
deque.removeFirst();
}
}
/**
* 获取最大值
*
* @return maxvalue
*/
Integer getMax() {
return deque.getFirst();
}
}
347.前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
public class Leetcode347 {
public static void main(String[] args) {
int[] nums = {1, 1, 1, 2, 2, 3};
int k = 2;
int[] ints = topKFrequent(nums, k);
Arrays.stream(ints).forEach(s -> System.out.print(s + " "));
}
public static int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
// 大顶堆
PriorityQueue<int[]> queue = new PriorityQueue<>((o1, o2) -> o2[1] - o1[1]);
map.forEach((key, value) ->
queue.add(new int[]{key, value})
);
int[] res = new int[k];
for (int i = 0; i < k; i++) {
res[i] = queue.poll()[0];
}
return res;
}
}