Leecode刷题笔记

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;
    }
原文地址:https://www.cnblogs.com/Alei777/p/15532716.html