zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    OpenCv 014---图像插值(Image interpolation)
    基础正则
    Base -快捷键|通配符|特殊符号|输出(正确与错误的保存)
    linux 软链接 硬链接
    shell 别名alias
    yii2 源码分析1从入口开始
    php const static define 基本用法和区别
    php-fpm, nginx ,fastcgi ,php-cgi 关系粗解
    php扩展开发3--扩展类传参数
    php扩展开发2--添加类
  • 原文地址:https://www.cnblogs.com/Alei777/p/15532716.html
Copyright © 2011-2022 走看看