1. 程式人生 > 資訊 >訊息稱蘋果 iPhone 13/Pro 系列或將漲價,業內人士稱可能性不大

訊息稱蘋果 iPhone 13/Pro 系列或將漲價,業內人士稱可能性不大

最初版本程式碼:

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

改進點:

  1. 對mid的賦值從mid=(left+right)/2 改成了mid=left+(right-left)/2;
  2. 將對mid的賦值從 else裡移到了while迴圈的開頭;
  3. 取消了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