zoukankan      html  css  js  c++  java
  • leetcode 二分法2

    开平方

    二分法,看单调函数走势,注意如何求 mid,以及注意除0 ,溢出

    package leetcodemid.二分专题;
    
    /**
     * 69. Sqrt(x)
     * 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
     * <p>
     * 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
     * <p>
     * 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
     * <p>
     * <p>
     * <p>
     * 示例 1:
     * <p>
     * 输入:x = 4
     * 输出:2
     * 示例 2:
     * <p>
     * 输入:x = 8
     * 输出:2
     * 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
     * <p>
     * <p>
     * 提示:
     * <p>
     * 0 <= x <= 231 - 1
     */
    public class MySqrt {
        /**
         * 二分法,看这个函数的图形 单调函数
         * @param x
         * @return
         */
        public static 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;
    
    
        }
    
        /**
         * 第二种写法
         * @param x
         * @return
         */
        public static int mySqlr2(int x){
            //特殊值特殊处理
            if(x == 1 || x == 0){
                return x;
            }
            int left = 0;
            int right = x;
            int mid = 0;
            //经典二分—注意等值处理
            while(left <= right){
                mid = left + (right - left) / 2;
                if(mid > x / mid){
                    right = mid - 1;
                }else if(mid < x / mid){
                    left = mid + 1;
                }else{
                    //相等毫无疑问返回mid
                    return mid;
                }
            }
            //否则,则一定是right
            return right;
        }
        public static void main(String[] args) {
            System.out.println(mySqrt(4));
        }
    }
    
    
  • 相关阅读:
    并不对劲的辛普森积分
    并不对劲的概率与期望
    并不对劲的cdq分治解三维偏序
    68.机器人的运动范围
    67.矩阵中的路径
    66.滑动窗口最大值
    65.数据流的中位数
    64.二叉搜索树的第K个节点
    63.序列化二叉树
    62.把二叉树打印成多行
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/15670835.html
Copyright © 2011-2022 走看看