2、leetcode278 第一个错误的版本**
生活随笔
收集整理的這篇文章主要介紹了
2、leetcode278 第一个错误的版本**
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
leetcode 278 第一個錯誤的版本
你是產品經理,目前正在帶領一個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由于每個版本都是基于之前的版本開發的,所以錯誤的版本之后的所有版本都是錯的。
假設你有 n 個版本 [1, 2, …, n],你想找出導致之后所有版本出錯的第一個錯誤的版本。
你可以通過調用 bool isBadVersion(version) 接口來判斷版本號 version 是否在單元測試中出錯。實現一個函數來查找第一個錯誤的版本。你應該盡量減少對調用 API 的次數。
示例 1:
輸入:n = 5, bad = 4
輸出:4
解釋:
調用 isBadVersion(3) -> false
調用 isBadVersion(5) -> true
調用 isBadVersion(4) -> true
所以,4 是第一個錯誤的版本。
示例 2:
輸入:n = 1, bad = 1
輸出:1
文章目錄
- leetcode 278 第一個錯誤的版本
- 二分法一
- 二分法二
二分法一
這題相比于leetcode 704題稍微有點難度,leetcode 704
public int firstBadVersion(int n) {int left=1;int right=n;while(left<right){int mid=left+((right-left)>>1);//是壞的版本,right賦值為mid;right可不可以賦值right=mid-1?//可以,但是while循環中的條件就需要改變,見方法二。因為while循環// 中的條件是left<right,即當left==right時退出循環,也就是left或// 者right即為答案;// 因為題目要找第一個壞的版本的序號,所以心里要有一種無限逼近的思// 想,當mid是壞的版本,right就賦值為mid,但是不return,繼續逼// 近;當第二輪循環mid不是壞的版本,我們就需要將left賦值為mid+1,// 因為mid肯定不是壞的版本,所以left不賦值mid。// 最后一次循環比如left=5,right=6,mid算出為5;當5為壞的版本時,// right賦值mid等于5;當5不是壞的版本時,left=mid+1=6;// 不論哪種情況都滿足left==right,所以退出循環,返回left或者right。if(isBadVersion(mid)){right=mid;}else{//不是壞的版本left=mid+1;}}return right; //或者返回left都可以}二分法二
public int firstBadVersion(int n) {int left=1;int right=n;//while條件這么寫其實給自己增加麻煩了,但是為了掌握二分法,大家可以都試試。//這邊條件結束是left>right,也就是left==right+1退出循環while(left<=right){int mid=left+((right-left)>>1);//當mid是壞的版本,right=mid-1;但是這么寫可能錯過最終答案,//比如版本中只有最后一個版本是錯的,那right=mid-1就有可能錯過;//但是要注意while循環中的條件是left>right,即left==right+1退出循環;//我們最后的答案返回的是left,也就是right+1,所以這一減一加又到 了正確答案。if(isBadVersion(mid)){right=mid-1;}else{left=mid+1;//不是壞的版本}}return left;//這邊只能返回left}總結
以上是生活随笔為你收集整理的2、leetcode278 第一个错误的版本**的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1、leetcode704 二分查找*
- 下一篇: 3、leetcode35 搜索插入位置*