12.29 LeetCode(剑指offer)

65 阅读1分钟

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;
};