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会越界
浙公网安备 33010602011771号