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; } }