前言
繼續看幾個隊列和棧的題目
有效括號
使用棧:
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;
}
無權圖 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
}