当前位置:   article > 正文

Leetcode剑指Offer刷题 - 第二十七天_leedecode刷题得优先级是剑指offer才是leedcode前200就够吗

leedecode刷题得优先级是剑指offer才是leedcode前200就够吗

Leetcode剑指Offer刷题指南:

Leetcode剑指Offer刷题-学习计划目录_DEGv587的博客-CSDN博客

剑指 Offer 59 - I. 滑动窗口的最大值

解法一:暴力模拟

  1. class Solution {
  2. public int[] maxSlidingWindow(int[] nums, int k) {
  3. if (nums.length == 0) return new int[0];
  4. int len = nums.length - k + 1;
  5. List<Integer> list = new ArrayList<>();
  6. int[] ret = new int[len];
  7. for (int i = 0; i < len; ++i) {
  8. int max = Integer.MIN_VALUE;
  9. for (int j = i; j < i + k; ++j) {
  10. max = Math.max(nums[j], max);
  11. }
  12. list.add(max);
  13. }
  14. for (int i = 0; i < len; ++i) {
  15. ret[i] = list.get(i);
  16. }
  17. return ret;
  18. }
  19. }

解法二:单调队列(优化版)

  1. class Solution {
  2. public int[] maxSlidingWindow(int[] nums, int k) {
  3. if (nums.length == 0 || k == 0) return new int[0];
  4. Deque<Integer> deque = new LinkedList<>();
  5. int[] ret = new int[nums.length - k + 1];
  6. int index = 0;
  7. //未形成窗口区间
  8. for (int i = 0; i < k; ++i) {
  9. //队列不为空时,当前值与队列尾部值比较,如果大于,删除队列尾部值
  10. //一直循环删除到队列中的值都大于当前值,或者删到队列为空
  11. while (!deque.isEmpty() && nums[i] > deque.peekLast()) {
  12. deque.removeLast();
  13. }
  14. //执行完上面的循环后,队列中要么为空,要么值都比当前值大,然后就把当前值添加到队列中
  15. deque.addLast(nums[i]);
  16. }
  17. //窗口区间刚形成后,把队列首位值添加到队列中
  18. ret[index++] = deque.peekFirst();
  19. //窗口区间形成
  20. for (int i = k; i < nums.length; ++i) {
  21. //i-k是已经在区间外了,如果首位等于nums[i-k],那么说明此时首位值已经不再区间内了,需要删除
  22. if (deque.peekFirst() == nums[i - k]) {
  23. deque.removeFirst();
  24. }
  25. //删除队列中比当前值小的值
  26. while (!deque.isEmpty() && deque.peekLast() < nums[i]) {
  27. deque.removeLast();
  28. }
  29. //把当前值添加到队列中
  30. deque.addLast(nums[i]);
  31. //把队列的首位值添加到arr数组中
  32. ret[index++] = deque.peekFirst();
  33. }
  34. return ret;
  35. }
  36. }

剑指 Offer 59 - II. 队列的最大值

解法:滑动窗口(双端队列)

  1. class MaxQueue {
  2. Deque<Integer> queue, deque;
  3. public MaxQueue() {
  4. //初始化队列 queue ,双向队列 deque
  5. queue = new LinkedList<Integer>();
  6. deque = new LinkedList<Integer>();
  7. }
  8. public int max_value() {
  9. //当双向队列 deque 为空,则返回 -1 ;
  10. //否则,返回 deque 首元素;
  11. return deque.isEmpty() ? -1 : deque.peekFirst();
  12. }
  13. public void push_back(int value) {
  14. //将元素 value 入队 queue ;
  15. queue.addLast(value);
  16. //将双向队列中队尾 所有 小于 value 的元素弹出(以保持 deque 非单调递减),并将元素 value 入队 deque
  17. while (!deque.isEmpty() && deque.peekLast() < value) {
  18. deque.removeLast();
  19. }
  20. deque.addLast(value);
  21. }
  22. public int pop_front() {
  23. //若队列 queue 为空,则直接返回 -1 ;
  24. if (queue.isEmpty()) return -1;
  25. //否则,将 queue 首元素出队;
  26. //若 deque 首元素和 queue 首元素 相等 ,则将 deque 首元素出队(以保持两队列 元素一致 ) ;
  27. if (queue.peekFirst().equals(deque.peekFirst())) {
  28. deque.removeFirst();
  29. }
  30. return queue.removeFirst();
  31. }
  32. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/1005089
推荐阅读
相关标签
  

闽ICP备14008679号