JS:二维数组中的查找+树的子结构

150 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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:

image.png

给定的树 B:

image.png

返回 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)
}

想拥有小熊一体锅的第三天。