[E二分法]lc69。xの平方根(2つの二分法+境界処理)

記事のディレクトリ

1.主題の出典

リンク:69。xの平方根

2.トピック分析

序文:

2点で十分です。2番目のテンプレートを使用すると入力8と出力3の恥ずかしい状況が発生するため、2番目の二分テンプレートを使用しないように注意してください。2番目のテンプレートが見つからないため、最初のテンプレートその場所よりも大きくなります。現在の二分テンプレートは、それよりも小さい最後の番号で停止します。

上記の理論に基づくと、ほとんどの根は小数です。小数の左側の整数はそれよりも小さいので、右側の整数はそれよりも大きいのではありません。したがって、2番目のテンプレートは使用しないでください。

  • 時間計算量O(n)O(n)O n
  • スペースの複雑さO(n)O(n)O n

コード:

// 中间值转 ll 取巧,判断越界
class Solution {
    
    
public:
    int mySqrt(int x) {
    
    
        int l = 0, r = x;
        while (l < r) {
    
    
            int mid = l + 1ll + r>> 1;
            if (mid <= x / mid) l = mid;
            else r = mid - 1;
        }
        return l;
    }
};

class Solution {
    
    
public:
    int mySqrt(int x) {
    
    
	    // j 将特殊情况进行特判 
	    // 1. 防止while 一开始就进不去  
        // 2. 进去之后 mid 可能存在 0 的风险
        if(x <= 1) return x;   
        

        int  l = 0, r = x;
        while (l < r) {
    
    
            int mid = l + 0ll + r  >> 1 ;
            if (mid > x / mid)  r = mid;	// 不要写等于,减少判断,对自己好一点吧,让 l 找到第一个比根号 x 大的数
            else l = mid + 1 ;
        }
        return l - 1 ;
    }
};

おすすめ

転載: blog.csdn.net/yl_puyu/article/details/111876804