携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
题目描述(1):JS矩形中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word。如果 word 存在于网格中,返回 true;否则,返回false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false
个人想法
先另i等于数列的行数,j等于数列的个数,k等于我们目前遍历到的数字的索引数。 如果行数/列数小于零或者大于题目中给的范围,直接返回false;如果当前遍历到的索引的数字不是给定word中的数字,直接返回false;
如果当前遍历到的索引数等于word单词的长度,则说明找到了正确的路线,返回true,同时,使当前索引的这个数字为“ ”,在设置变量res,使得res为该索引对应的下一位数字,下一位数字有四种情况(上下左右),此时已经遍历到下一位数字了,则把之前索引所对应的数字设置回原来的数。
以上,完成遍历找到最适合的路径了。下面我们将m等于行数,n等于列数;从第一行第一个数字开始遍历,逐一遍历,当前索引为0时,也就是只有一个数字时,必然返回true,否则返回false。
这就是我对这道题的思路,下面用代码来实现。
代码如下:
/**
* @param {character[][]} board
* @param {string} word
* @return {boolean}
*/
var exist = function (board, word) {
const dfs = (i, j, k) => {
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] !== word[k])
return false;
if (k === word.length - 1)
return true
board[i][j] = ""
let res = dfs(i, j + 1, k + 1) || dfs(i + 1, j, k + 1) || dfs(i - 1, j, k + 1) || dfs(i, j - 1, k + 1)
board[i][j] = word[k]
return res;
}
const m = board.length, n = board[0].length
for (let i = 0; i <= m; i++) {
for (let j = 0; j <= n; j++) {
if (dfs(i, j, 0))
return true
}
}
return false;
};
题目描述(2):二叉搜索树第k大节点
给定一棵二叉搜索树,请找出其中第 k 大的节点的值。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 4
思路分析:
我首先想到的是中序遍历:左 -> 中 ->右,这样只要遍历完返回第length-k个节点就是我们的目标值了。但是这有点浪费性能,因为要把每一个节点都遍历到,因为要获得length,但是我们只要第k个就好了啊,所以遍历的有点多余,那么这时候我们想到,或许倒过来遍历是不是会更好一点,也就是说 右->中->左,这样就可以直接返回到第k个元素了,无需遍历k元素后面的小值,即无需遍历完整数组,达到优化性能了。
代码实现:
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthLargest = function (root, k) {
let res;
const order = (root) => {
if (!root) return null //没有根节点直接null
order(root.right) //遍历右节点
k-- //每遍历完一个k都会少1个
if (!k) return order(res = root.val) //没有k的话找到这个值啦!
order(root.left) ///遍历左节点
}
order(root) //根节点
return res; 返回第k大的值~~
};
想拥有小熊一体锅的第一天。