美文网首页
牛客网编程整理

牛客网编程整理

作者: 火乐君_52cd | 来源:发表于2018-08-25 00:15 被阅读0次

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

    • 本题思路:
      基于数组从左向右递增,同行元素中的最大值在最右端
      从上向下递增,同列元素的最大值在最下端
      故而,选取数组中任一元素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;
        }
    }
    

    相关文章

      网友评论

          本文标题:牛客网编程整理

          本文链接:https://www.haomeiwen.com/subject/pwkwiftx.html