LeetCode-探索-初级算法-排序和搜索-2. 第一个错误的版本(个人做题记录,不是习题讲解)
LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/
- 第一个错误的版本
-
语言:java
-
思路:二分查找,每次取中间和中间的右边那个进行判断。
-
代码(19ms,击败23.74%,丢人,哈哈):
/* The isBadVersion API is defined in the parent class VersionControl. boolean isBadVersion(int version); */ public class Solution extends VersionControl { public int firstBadVersion(int n) { if(n>1){ int start = 1; int end = n; int middle; boolean left = false; boolean right = false; while(start<=end){ middle = start + (end-start)/2; left = isBadVersion(middle); if(!left){ right = isBadVersion(middle+1); if(right) return middle+1; else{ start = middle+1; } } else{ end = middle - 1; } } } return 1; } }
-
参考代码(11ms):其实思想都是二分查找,就是我的实现代码太low了。
public class Solution extends VersionControl { public int firstBadVersion(int n) { int l = 1, r = n; while (l < r) { int mid = (l + r) >>> 1; if (isBadVersion(mid)) { r = mid; // System.out.println("badVersion: " + mid); } else { // System.out.println("goodVersion: " + mid); l = mid + 1; } // System.out.println("l :" + l + " r:" + r); } return r; } }
-
参考后重写(12ms):主要是要清楚最后返回的是end,因为end就是符合条件的那个
/* The isBadVersion API is defined in the parent class VersionControl. boolean isBadVersion(int version); */ public class Solution extends VersionControl { public int firstBadVersion(int n) { int start = 1; int end = n; int middle; while(start<end){ middle = (start+end)>>>1; if(isBadVersion(middle)){ end = middle; }else{ start = middle + 1; } } return end; } }