0
点赞
收藏
分享

微信扫一扫

【LeetCode】Day5-x的平方根

乌龙茶3297 2022-03-12 阅读 42
leetcode

题目1

1. 两数之和【简单】

题解1

发现自己以前刷过这题,但是用的无脑暴力解法,时间复杂度 O ( n 2 ) O(n^2) O(n2)

这次换个解法,用哈希表来做,时间复杂度 O ( n ) O(n) O(n),主要是记一下java里Map咋用

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer>hashMap=new HashMap<Integer,Integer>();
        for(int i=0;i<nums.length;i++){
            if(hashMap.containsKey(target-nums[i])){
                return new int[]{hashMap.get(target-nums[i]),i};
            }
            hashMap.put(nums[i],i);
        }
        return new int[0];//创建一个容量为0的数组,即空数组(常用技巧)
    }
}

题目2

69. x的平方根【简单】

题解2

二分法

求解x的平方根k,k是 k 2 < = x k^2<=x k2<=x的最大值,因此从0到x二分找k

注意0和1的特殊值处理

class Solution {
    public int mySqrt(int x) {
        //0和1特殊讨论
        if(x==0)
            return 0;
        if(x==1)
            return 1;
        long low=0,high=x;
        while(low<=high){
            long mid=low+(high-low)/2;
            long r=x/mid;//防止乘法溢出,改用除法
            if(mid<r) low=mid+1;
            else if(mid>r) high=mid-1;
            else return (int)mid;
        }
        return (int)low-1;
    }
}

牛顿迭代法

构造函数 f ( x ) = y = x 2 − C f(x)=y=x^2-C f(x)=y=x2C

迭代公式 x i + 1 = ( 1 / 2 ) ( x i + C / x i ) x_{i+1}=(1/2)(x_i+C/x_i) xi+1=(1/2)(xi+C/xi),k次迭代后, x k x_k xk与真实值 C \sqrt{C} C 足够接近,即可作为答案

class Solution {
    public int mySqrt(int x) {
        //0特殊讨论
        if(x==0)
            return 0;
        double C=x,x0=x;
        //迭代
        while(true){
            double xi=(x0+C/x0)/2;
            if(Math.abs(x0-xi)<1e-7)
                break;
            x0=xi;
        }
        return (int)x0;
    }
}
举报

相关推荐

0 条评论