110. 平衡二叉树
难度:简单
1、递归求二叉树的深度
1 public int depth(TreeNode root){ 2 if(root==null){ 3 return 0; 4 } 5 return Math.max(depth(root.left),depth(root.right))+1; // 加这个1 是指当前层+1; 6 }
这道题,除了求根节点,还需要再求所有子节点。
2、递归求每个节点的左右子树高度
public boolean isBalanced(TreeNode root) { if(root==null){ return true;//当前节点为空返回yes } int left=depth(root.left);//计算当前左子树高度 int right=depth(root.right);//计算当前右子树高度 return Math.abs(left-right)<=1&&isBalanced(root.left)&&isBalanced(root.right);
//左子树 右子树高度差不超过1,左右子树并且都是平时二叉树
}
69、Sqrt(x)
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
知识点:由于x平方根的整数部分满足 k^2<=x的最大值,因此可以对k进行二分查找。下界为0,上界为x。 比较中间的数的平方与x的大小关系。
class Solution { public int mySqrt(int x) { int l = 0, r = x, ans = -1; while (l <= r) { int mid = l + (r - l) / 2; if ((long) mid * mid <= x) { ans = mid; l = mid + 1; } else { r = mid - 1; } } return ans; } }
367. 有效的完全平方数
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt
找根号,下界为0,上界为num,用二分进行查找,判断条件为l<=r 。
34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
public int[] searchRange(int[] nums, int target) { int leftBorder = getLeftBorder(nums, target); int rightBorder = getRightBorder(nums, target); // 情况一 if (leftBorder == -2 || rightBorder == -2) return new int[]{-1, -1}; // 情况三 if (rightBorder - leftBorder > 1) return new int[]{leftBorder + 1, rightBorder - 1}; // 情况二 return new int[]{-1, -1}; } public int getRightBorder(int[] nums,int target){ int left=0; int right=nums.length-1; int rightBoard=-2; while(left<=right){ int middle=left+((right-left)/2);//防止移除 等同于(left+right)/2 if(nums[middle]>target){ right=middle-1;//target在左边 }else{ left=middle+1;//当nums[middle]==target的时候,更新left,这样才能得到target右边界 rightBoard=left; } } return rightBoard; } public int getLeftBorder(int[] nums,int target){ int left=0; int right=nums.length-1; int leftBoard=-2; while(left<=right){ int middle=left+((right-left)/2); if(nums[middle]<target){ left=middle+1; }else{ //nums【mid】 ==target 更新right 找右边界 找左边的值, leftBoard=right. right=middle-1; leftBoard=right; } } return leftBoard; }