二进制从leetcode oj搜索平方根

时间:2014-11-16 05:45:24

标签: algorithm data-structures

public static int sqrt(int x) {

     if( x == 0 || x == 1){
         return x;
     }
     long start = 0;
     long end = x;


     while ( end-start > 1){
         long mid = (int)(end + start) / 2;
         long s = mid * mid;

         if(s == x){
             return (int)mid;
         }
         else if(s > x){
             end = mid;
         }
         else {
             start = mid;
         }

     }

     return (int)start;
    }

以上是工作代码段。我有以下问题。提前谢谢你的帮助。 ; - )

  1. 虽然(end-start> 1)为什么我们需要1?仅仅因为返回签名是int?
  2. 如果我们从while(end-start> 1)到while(end> start)改变while循环,我们必须使end = mid-1;并且start = mid + 1,对吗?还有一步之遥,我想知道这是否也是由于返回类型是整数?
  3. 为什么我们无法返回 结束? 或( int)(开始+结束)/ 2 ??我看到几乎99%的回答返回到二分搜索的左边界。我只是想知道返回右边界或中间边界是否正常?

1 个答案:

答案 0 :(得分:0)

返回类型int仅表示您返回类型为int的结果。它与方法体内的算法无关。下面我试着回答你的问题:

  1. While(end-start > 1)用于确保end始终大于start。如果end-start为1或小于1,则表示您已到达二进制搜索结束。
  2. 您可以继续将while(end-start > 1)更改为while(end > start),它仍然可以使用。不必制作end = mid-1并开始= mid+1
  3. 这完全取决于你回答谎言的地方。每个问题都可能有所不同。
  4. 您应该尝试以下链接以更好地理解二进制搜索算法。

    http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binarySearch

    希望它有所帮助。