1、滑动窗口最大值(239)

地址:https://leetcode-cn.com/problems/sliding-window-maximum/

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} k
  4. * @return {number[]}
  5. */
  6. const maxSlidingWindow = function (nums, k) {
  7. // 缓存数组的长度
  8. const len = nums.length;
  9. // 定义结果数组
  10. const res = [];
  11. // 初始化左指针
  12. let left = 0;
  13. // 初始化右指针
  14. let right = k - 1;
  15. // 当数组没有被遍历完时,执行循环体内的逻辑
  16. while (right < len) {
  17. // 计算当前窗口内的最大值
  18. const max = calMax(nums, left, right);
  19. // 将最大值推入结果数组
  20. res.push(max);
  21. // 左指针前进一步
  22. left++;
  23. // 右指针前进一步
  24. right++;
  25. }
  26. // 返回结果数组
  27. return res;
  28. };
  29. // 这个函数用来计算最大值
  30. function calMax(arr, left, right) {
  31. // 处理数组为空的边界情况
  32. if (!arr || !arr.length) {
  33. return;
  34. }
  35. // 初始化 maxNum 的值为窗口内第一个元素
  36. let maxNum = arr[left];
  37. // 遍历窗口内所有元素,更新 maxNum 的值
  38. for (let i = left; i <= right; i++) {
  39. if (arr[i] > maxNum) {
  40. maxNum = arr[i];
  41. }
  42. }
  43. // 返回最大值
  44. return maxNum;
  45. }

2、用栈实现一个队列(232)

地址:https://leetcode-cn.com/problems/implement-queue-using-stacks/

  1. /**
  2. * 初始化构造函数
  3. */
  4. const MyQueue = function () {
  5. // 初始化两个栈
  6. this.stack1 = [];
  7. this.stack2 = [];
  8. };
  9. /**
  10. * Push element x to the back of queue.
  11. * @param {number} x
  12. * @return {void}
  13. */
  14. MyQueue.prototype.push = function (x) {
  15. // 直接调度数组的 push 方法
  16. this.stack1.push(x);
  17. };
  18. /**
  19. * Removes the element from in front of queue and returns that element.
  20. * @return {number}
  21. */
  22. MyQueue.prototype.pop = function () {
  23. // 假如 stack2 为空,需要将 stack1 的元素转移进来
  24. if (this.stack2.length <= 0) {
  25. // 当 stack1 不为空时,出栈
  26. while (this.stack1.length !== 0) {
  27. // 将 stack1 出栈的元素推入 stack2
  28. this.stack2.push(this.stack1.pop());
  29. }
  30. }
  31. // 为了达到逆序的目的,我们只从 stack2 里出栈元素
  32. return this.stack2.pop();
  33. };
  34. /**
  35. * Get the front element.
  36. * @return {number}
  37. * 这个方法和 pop 唯一的区别就是没有将定位到的值出栈
  38. */
  39. MyQueue.prototype.peek = function () {
  40. if (this.stack2.length <= 0) {
  41. // 当 stack1 不为空时,出栈
  42. while (this.stack1.length != 0) {
  43. // 将 stack1 出栈的元素推入 stack2
  44. this.stack2.push(this.stack1.pop());
  45. }
  46. }
  47. // 缓存 stack2 的长度
  48. const stack2Len = this.stack2.length;
  49. return stack2Len && this.stack2[stack2Len - 1];
  50. };
  51. /**
  52. * Returns whether the queue is empty.
  53. * @return {boolean}
  54. */
  55. MyQueue.prototype.empty = function () {
  56. // 若 stack1 和 stack2 均为空,那么队列空
  57. return !this.stack1.length && !this.stack2.length;
  58. };