二维数组,从左向右递增,从上向下递增,查找特定数值
- 本题思路:
基于数组从左向右递增,同行元素中的最大值在最右端
从上向下递增,同列元素的最大值在最下端
故而,选取数组中任一元素x,将其与目标元素t相比较,若x > t,则向左上方移动,x < t,向右下方移动
故而,根据题目意图,可有如下三种措施:
- 从最小值递增,直至找到目标元素或目标元素不存在
- 从最大值递减,直至找到目标元素或目标元素不存在
- 选取数组右上角或左下角作为初始元素,从而可以在两种情况的每种情况下减少一种操作选项,采用动态规划的思想,一步步调整直至数组元素与目标元素相等
前两种方法属于纯粹的暴力解,时间复杂度会非常的高,故而放弃
采用第三种思路
- 代码如下:
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;
}
}
二叉树子结构验证问题
- 运用了递归的思想,递归调用了所设计的验证方法:
- 首先比较根节点,如果值相同,则直接比较其所有子节点是否相同
- 如果根节点值不相同,则分别取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;
}
}
网友评论