69、x的平方根

问题描述

在这里插入图片描述

问题分析

如果直接用暴力遍历法。会超时。考虑使用二分查找法(采用二分!!不是分治!!!搞清楚两者的区别!!)。

二分查找没有什么可说的。说一下这个题目的一些坑:

  • 使用 x/mid < mid 而不是 mid*mid>x,防止int型溢出
  • 使用 x/mid < mid 而不是 x/mid > mid,首先从max开始缩小,若首先从min开始扩大会产生问题。
  • while条件使用max-min>1 而不是 max>min,处理min+1=max的特殊情况

解法:二分查找

  • 时间复杂度:O(logN),二分法的时间复杂度是对数级别的。
  • 空间复杂度:O(1),使用了常数个数的辅助空间用于存储和比较。

Java代码

package com.company;

public class Main {

    public static void main(String[] args) {

        int a = 4;
        System.out.println(mySqrt(a));


    }



    static public int mySqrt(int x) {
        if (x == 0 || x == 1){
            return x;
        }

        int max = x;
        int min = 0;
        while (max - min > 1){
            int mid = (max + min)/2;
            if (x/mid < mid){
                max = mid;
            }else {

                min = mid;
            }
        }
        return min;
    }

}

结果分析

以上代码的执行结果:

执行时间内存消耗
2 ms33.6 MB

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值