leetcode_278_第一个错误版本_二分查找

 1 /**
 2  * 278. 第一个错误的版本
 3  * 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
 4  *
 5  * 假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
 6  *
 7  * 你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
 8  *
 9  * 示例:
10  *
11  * 给定 n = 5,并且 version = 4 是第一个错误的版本。
12  *
13  * 调用 isBadVersion(3) -> false
14  * 调用 isBadVersion(5) -> true
15  * 调用 isBadVersion(4) -> true
16  *
17  * 所以,4 是第一个错误的版本。
18  */
19 public class Solution {
20     private static int n = 5;
21 
22     public static void main(String[] args) {
23         System.out.println(firstBadVersion(n));
24     }
25 
26     public static int firstBadVersion(int n) {
27         if (n == 1) {
28             return n;
29         }
30         int left = 1;
31         int right = n;
32         long mid = 0;
33         boolean bFlag = false;
34         while (left < right) {
35             bFlag = false;
36             mid = ((long) left + (long) right) / 2;
37             if (isBadVersion((int) mid)) {
38                 right = (int) mid;
39                 bFlag = true;
40             } else {
41                 left = (int) mid + 1;
42             }
43         }
44         //减少一次 isBadVersion调用
45 //        return isBadVersion((int) mid)?(int) mid:(int) mid + 1;
46         if (bFlag)
47             return (int) mid;
48         else
49             return (int) mid + 1;
50 
51     }
52 
53     /**
54      * 自己实现的 isBadVersion 方便本地调试
55      * @param version
56      * @return
57      */
58     public static boolean isBadVersion(int version) {
59         if (version > n / 2) {
60             return true;
61         }
62         return false;
63     }
64 }

 此题陷阱:

mid = ( left + right) / 2;  若mid为int会越界
posted @ 2014-06-15 14:40  卖油翁的牛  阅读(708)  评论(0)    收藏  举报