239. 滑动窗口最大值[https://leetcode.cn/problems/sliding-window-maximum/submissions/497438333/]
思路:滑动窗口大小为K,现在前K个数中找到Max值进入ans数组,然后开始向后遍历,每进入一个数字时先判断if(nums[i-k]==max)
,查看上一个max是否被滑动窗口滑出,若已滑出则在当前滑动窗口内重新找到max值并进入ans数组,重复上述过程知道数组遍历完成。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (k == 1) {
return nums;
}
int[] ans = new int[nums.length - k + 1];
int max = nums[0];
int i = 0;
for (; i < k; i++) {
max = nums[i] > max ? nums[i] : max;
}
ans[0] = max;
for (int j = 1; i < nums.length; i++, j++) {
if (nums[i - k] == max) {
max = nums[i - k + 1];
for (int x = i - k + 1; x <= i; x++) {
max = nums[x] > max ? nums[x] : max;
}
}
max = nums[i] > max ? nums[i] : max;
ans[j] = max;
}
return ans;
}
}
**测试用例通过了,但耗时太长。**
-----------------------------------------------------------------------------------------------------------
优化思路:使用队列实现,保持max始终在队头(当队头元素小于入队元素时,队头元素出队),当队头元素退出滑动窗口时,队头元素退出队列
-----------------------------------------------------------------------------------------------------------
class MyQueue {
Deque<Integer> deque = new LinkedList<>();
void poll(int val) {
if (!deque.isEmpty() && val == deque.peek()) {
deque.poll();
}
}
void add(int val) {
while (!deque.isEmpty() && val > deque.getLast()) {
deque.removeLast();
}
deque.add(val);
}
int peek() {
return deque.peek();
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length == 1) {
return nums;
}
int len = nums.length - k + 1;
// 存放结果元素的数组
int[] res = new int[len];
int num = 0;
// 自定义队列
MyQueue myQueue = new MyQueue();
// 先将前k的元素放入队列
for (int i = 0; i < k; i++) {
myQueue.add(nums[i]);
}
res[num++] = myQueue.peek();
for (int i = k; i < nums.length; i++) {
// 滑动窗口移除最前面的元素,移除是判断该元素是否放入队列
myQueue.poll(nums[i - k]);
myQueue.add(nums[i]);
res[num++] = myQueue.peek();
}
return res;
}
}
347.前K个高频元素[https://leetcode.cn/problems/top-k-frequent-elements/description/]
思路:没有使用代码录中的大根堆,太难了...我使用Map记录每个元素的值与其出现次数,再使用Collections.sort
重写Comparator
,对Map中按value排序,前K个高频元素就是遍历元素时前K个元素的Key。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int i : nums) {
if (!map.containsKey(i)) {
map.put(i, 1);
} else {
map.put(i, map.get(i) + 1);
}
}
Set<Map.Entry<Integer, Integer>> es = map.entrySet();
List<Map.Entry<Integer, Integer>> l1 = new ArrayList<>(es);
Collections.sort(l1, new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});
int i = 0;
int[] ans = new int[k];
for (Map.Entry<Integer, Integer> e : l1) {
ans[i] = e.getKey();
i++;
if (i == k) {
break;
}
}
return ans;
}
}
------------------------
这两天的题我感觉都特别难...
------------------------
标签:第十一天,deque,nums,int,max,代码,元素,随想录,ans
From: https://www.cnblogs.com/cssg/p/17980730