賓士釋出 EQE / AMG EQS 53 / EQG 等多款電動汽車、概念車
阿新 • • 發佈:2021-09-06
最初版本程式碼:
/* 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 left=1,right=n,mid=(left+right)/2; int result=0; while(true){ if(isBadVersion(mid)){ if(!isBadVersion(mid-1)){ result=mid; return result; } else{ right=mid-1; mid=(left+right)/2; } } else{ left=mid+1; mid=(left+right)/2; } } } }
執行結果:未通過,原因,超時。
一次改進:
/* 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 left=1,right=n; while(true){ mid=left+(right-left)/2; if(isBadVersion(mid)){ if(!isBadVersion(mid-1)){ return mid; } else{ right=mid-1; } } else{ left=mid+1; } } } }
改進點:
- 對mid的賦值從mid=(left+right)/2 改成了mid=left+(right-left)/2;
- 將對mid的賦值從 else裡移到了while迴圈的開頭;
- 取消了result變數的設定,取消了將mid複製給result的語句,直接返回mid。
其中2,3對程式碼的執行時間沒有多少減少,改進後能夠通過的關鍵點在於1,1能夠防止計算時溢位
官方答案:
public class Solution extends VersionControl { public int firstBadVersion(int n) { int left = 1, right = n; while (left < right) { // 迴圈直至區間左右端點相同 int mid = left + (right - left) / 2; // 防止計算時溢位 if (isBadVersion(mid)) { right = mid; // 答案在區間 [left, mid] 中 } else { left = mid + 1; // 答案在區間 [mid+1, right] 中 } } // 此時有 left == right,區間縮為一個點,即為答案 return left; } }
它與我的不同點在於在判斷isBadVersion後,他是直接令right=mid,把區間定在了[left,mid],而我,則是再進一步判斷mid是不是就是badVersion,此時在此呼叫了API,所以時間會比較長。while迴圈的條件是left<right是迴圈下去,當left=right時。這個就是答案,它的思想是一直縮區間,知道縮到最小區間即最終答案,而我是一遍縮區間,一邊判斷是不是答案。
什麼是計算溢位呢。
https://blog.csdn.net/malimingwq/article/details/97418866?utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1.no_search_link
這種操作常用於java二分法中
怎麼用java得到所以測試樣例呢?
本文來自部落格園,作者:北征愚人,轉載請註明原文連結:https://www.cnblogs.com/xukd/p/15262648.html