携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
今天周五!生龙活虎!芜湖~
题目1
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如如下矩阵,matrix(5):
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
个人想法:
首先当然是对暴力解法说no,如果for循环去遍历每一位数字再比较的话,有点占内存,且不是这道题的用意。
1.前提:数组长度是否为0,如果为0,直接返回false.
2.观察数组产生小想法,可以用target与左下角的值进行比较。倘若target>左下角值,则指针右移一位;倘若target<左下角值,则指针上移一位;恰好等于,返回true。
这样避免了去遍历所有数字。
左下角行值为matrix.length-1;列值为0;
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var findNumberIn2DArray = function (matrix, target) {
let i = matrix.length - 1
let j = 0;
if(matrix.length===0)return false
while (i >= 0 && j <matrix[0].length) {
if (target > matrix[i][j]) {
j++;
}
else if (target < matrix[i][j]) {
i--;
}
else if (target === matrix[i][j]) {
return true
}
}
return false
};
题目2
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
给定的树 B:
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值哦。
想法:
定义一个新函数,思考几种情况:
1.A为空,B中有节点存在,返回false;
2.B为空,A中有节点存在,返回true;
3.A,B都不为空,那么开始逐一遍历,逐层遍历,递归的方式。
在3中的子思考(子思考是什么鬼,git分支魔怔了),分别从A与B的根节点开始遍历,寻找A中与B根节点相等的值,找到之后再判断左右是否相等。
存在问题:A中可能存在多个与B根节点相等的值,此时电脑可能会盲目,无从下手。那就需要提前先把这些与B根节点相等的值全部找出来,笼统表示方法为A.left/A.right。
就这样,先找与B相等的节点,在判断子节点,嗯嗯没了,代码如下:
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} A
* @param {TreeNode} B
* @return {boolean}
*/
var isSubStructure = function (A, B) {
if (A == null || B == null) return false
return isSubStructure(A.left, B) || isSubStructure(A.right, B) ||isSame(A, B)
};
var isSame = function (A, B) {
if(!B) return true
if(!A) return false
return A.val === B.val &&
isSame(A.left, B.left) &&
isSame(A.right, B.right)
}
想拥有小熊一体锅的第三天。