幾個棧和隊列的題目

前言

繼續看幾個隊列和棧的題目

有效括號

使用棧:

function isValid = s => {
  let stack = [], repo = ['(', '[','{']
  for (let i = 0; i<s.length;i++) {
    let ch = s[i]
    if(repo.includes(s[i])) stack.push(ch)
    if(!stack.length) return false
    if(ch === ')' && stack.pop()!=='(') return false
    if(ch === ']' && stack.pop() !== '[' ) return false;
    if(ch === '}' && stack.pop() !== '{') return false;
  }
  return stack.length===0
}

多維數組轉化爲一維數組

let flatten = multyList =>
  multyList.reduce(
    (pre, cur) => pre.concat(Array.isArray(cur) ? flatten(cur) : cur),
    []
  );

二叉樹的層次遍歷

function levelOrder(root) {
  if (!root) return [];
  let queue = [],
    res = [],
    level = 0;
  queue.push(root);
  while (queue.length) {
    res.push([]);
    let size = queue.length;
    while (size--) {
      let front = queue.shift();
      res[level].push(front.val);
      if (front.left) queue.push(front.left);
      if (front.right) queue.push(front.right);
    }
    level++;
  }
  return res;
}

二叉樹的矩形層次遍歷

function levelOrderS(root) {
  if (!root) return [];
  let queue = [],
    res = [],
    level = 0;
  queue.push(root);
  while (queue.length) {
    let size = queue.length;
    res.push([]);
    while (size--) {
      let front = queue.shift();
      res[level].push(front.val);
      if (front.left) queue.push(front.left);
      if (front.right) queue.push(front.right);
    }
    if (level % 2 === 1) res[level].reverse();
    level++;
  }
  return res;
}

二叉樹的右視圖

function rightView(root) {
  if (!root) return [];
  let queue = [],
    res = [];
  queue.push(root);
  while (queue.length) {
    let size = queue.length;
    res.push(queue[0].val);
    while (size--) {
      let front = queue.shift();
      if (front.right) queue.push(front.right);
      if (front.left) queue.push(front.left);
    }
  }
  return res;
}

123

無權圖 BFS 遍歷

有些難理解,先這樣

function numSquare(n) {
  let queue = [],
    map = new Map();
  queue.push([n, 0]);
  while (queue.length) {
    let [num, step] = queue.shift();
    for (i = 1; ; i++) {
      let next = num - i * i;
      if (next < 0) break;
      if (next === 0) return step + 1;
      if (map.get(next) !== true) {
        map.set(next, true);
        queue.push([next, step + 1]);
      }
    }
  }
}

單詞接龍

先寫個判斷是否相鄰的函數,然後 BFS

function wordJieLong(start, end, dic) {
  const isNabor = (a, b) => {
    let diff = 0;
    for (let i = 0; i < a.length; i++) {
      if (a[i] !== b[i]) diff += 1;
      if (diff > 1) return false;
    }
    return true;
  };
  let queue = [start],
    res = 2;
  while (queue.length) {
    let size = queue.length;
    while (size--) {
      let front = queue.shift();
      for (let i = 0; i < dic.length; i++) {
        if (!isNabor(dic[i], front)) continue;
        if (dic[i] === end) return res;
        else queue.push(dic[i]);
        dic.splice(i, 1);
        i--;
      }
    }
    res++;
  }
  return 0;
}

滑動窗口最大值

function maxValueSlip(nums, k) {
  if(!nums || !k) return []
  let res =[], window = []
  for(let i = 0; i< nums.length; i++) {
    if(window[0]<=i-k) window.shift()
    while(nums[window.slice(-1)[0]] <= nums[i]) window.pop()
    window.push(i)
    if(i>=k-1) res.push(nums[window[0]])
  }
  return res
}
發佈了386 篇原創文章 · 獲贊 411 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章