12.矩阵中的路径
//回溯加上双for,时间复杂度也太高了。(好难!)
var exist = function (board, word) {
let m = board.length;
if (m < 1) return false;
let n = board[0].length;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (dfs(board, word, i, j, 0)) {
return true;
}
}
}
return false;
};
var dfs = (board, word, i, j, index) => {
if (i < 0 || j < 0 || i >= board.length || j >= board[0].length || board[i][j] !== word[index]) {
return false;
}
if (index == word.length - 1) return true;
//剪枝
board[i][j] = '';
//这里先赋值,最后return,一开始没想明白直接在这return了,后面复原了个寂寞。而且千万不要用index++!!!!!!这样后面的index变成了index+4了.....
let res = dfs(board, word, i + 1, j, index+1)||dfs(board, word, i, j + 1, index+1)||dfs(board, word, i - 1, j, index+1)||dfs(board, word, i, j - 1, index+1);
board[i][j] = word[index];
return res;
}
//再写一遍,不过有length的过滤会更快一点。
var exist = function(board, word) {
for(let i = 0; i<board.length;i++){
for(let j = 0;j<board[0].length;j++){
if(dfs(board, word, i, j, 0)){
return true;
}
}
}
return false;
};
var dfs = (board, word, i, j, index)=>{
if(i<0||j<0||i>=board.length||j>=board[0].length||board[i][j]!=word[index]){
return false;
}
if(index == word.length-1) return true;
board[i][j] = false;
let res = dfs(board, word, i+1, j, index+1)||dfs(board, word, i, j+1, index+1)||dfs(board, word, i, j-1, index+1)||dfs(board, word, i-1, j, index+1)
board[i][j] = word[index];
return res;
}
54.二叉搜索树的第k大的结点
//中序遍历,得到有序数组。
var kthLargest = function(root, k) {
let res = [];
dfs(root, res);
return res[res.length-k];
};
var dfs = (root, arr)=>{
if(root.left) dfs(root.left, arr);
arr.push(root.val);
if(root.right) dfs(root.right, arr);
}
//优化后的中序遍历,dfs内如果传k会出错。暂时不知道为啥
var kthLargest = function (root, k) {
let res = 0;
var dfs = (root) => {
if(!root) return;
dfs(root.right);
if (--k == 0) res = root.val;
dfs(root.left);
}
dfs(root);
return res;
};