牛客网编程整理

二维数组,从左向右递增,从上向下递增,查找特定数值

  • 本题思路:
    基于数组从左向右递增,同行元素中的最大值在最右端
    从上向下递增,同列元素的最大值在最下端
    故而,选取数组中任一元素x,将其与目标元素t相比较,若x > t,则向左上方移动,x < t,向右下方移动
    故而,根据题目意图,可有如下三种措施:
    1. 从最小值递增,直至找到目标元素或目标元素不存在
    2. 从最大值递减,直至找到目标元素或目标元素不存在
    3. 选取数组右上角或左下角作为初始元素,从而可以在两种情况的每种情况下减少一种操作选项,采用动态规划的思想,一步步调整直至数组元素与目标元素相等

前两种方法属于纯粹的暴力解,时间复杂度会非常的高,故而放弃
采用第三种思路

  • 代码如下:
public class Solution {//本解法采用了数组左下角元素作为初始元素
    public boolean Find(int target, int [][] array) {
        int i = array.length - 1;
        int j = 0;
        while((i >= 0) && (j < array[0].length)){
            if(array[i][j] > target){//数组元素大于目标元素,上移
                i--;
            }
            else if(array[i][j] < target){//数组元素小于目标元素,右移
                j++;
            }
            else{
                //题干中写出目标元素必然存在于数组中,故不需要考虑目标元素不存在的情况
                //不大不小就是等于嘛,游戏结束
                return true;
            }
        }
        return false;
    }
}

重建二叉树!!!这个我死活学不会java咋写qaqaqaqaq

好吧。。这个如果是切分原始数组生成新数组的话我会,但是如果说原址直接进行树的构建。。我能看懂,但写不出来。。。

统计输入整数二进制时1得个数

  • 位运算符对二进制数进行运算的思想:
    &是二进制“与”运算,参加运算的两个数的二进制按位进行运算
    0 & 0=0
    0 & 1=0
    1 & 0=0
    1 & 1=1
public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n != 0){
            count++;
            n = (n-1)&n;//这里采用位与(&)运算
        }
        return count;
    }
}

二叉树子结构验证问题

  • 运用了递归的思想,递归调用了所设计的验证方法:
    1. 首先比较根节点,如果值相同,则直接比较其所有子节点是否相同
    2. 如果根节点值不相同,则分别取A树的左子树和右子树作为新的二叉树,和B树进行新一轮的根节点的比较
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {//比较根节点是否相同
        if(root2 == null) return false;//题干要求,空树不为任何树的子树
        if(root1 == null && root2 != null) return false; //如果a树为空,它就只能有空树这一种子结构
        boolean flag = false;
        if(root1.val == root2.val) flag = isSubtree(root1,root2);//相同值得情况下比较所有子节点
        if(!flag){
            flag = HasSubtree(root1.left,root2);//不同值得情况下比较a树左子树
            if(!flag){
                flag = HasSubtree(root1.right,root2);//左边不行比右边,相当于将右子树作为新的二叉树根进行比较
            }
        }
        return flag;
    }
    public boolean isSubtree(TreeNode root1,TreeNode root2){//这个是比较所有子节点是否都一致的方法
        if(root2 == null) return true;
        if(root1 == null && root2 != null) return false;
        if(root1.val == root2.val) return isSubtree(root1.left,root2.left) && isSubtree(root1.right,root2.right);
        else return false;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容