704. 二分查找、278. 第一個錯誤的版本

704. 二分查找
給定一個 n 個元素有序的(升序)整型數(shù)組 nums 和一個目標(biāo)值 target ,寫一個函數(shù)搜索 nums 中的 target,如果目標(biāo)值存在返回下標(biāo),否則返回 -1。

示例 1:

輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現(xiàn)在 nums 中并且下標(biāo)為 4
示例 2:

輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/binary-search
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

解題思路及方法

經(jīng)典不多逼逼。

class Solution {
    public int search(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        int res = -1;
        while (left <= right) {
            res = (left + right) / 2;
            if (nums[res] == target) return res;
            if (nums[res] < target) left = res + 1;
            if (nums[res] > target) right = res - 1;
        }
        
        return -1;
    }
}

結(jié)果如下:

278. 第一個錯誤的版本
你是產(chǎn)品經(jīng)理,目前正在帶領(lǐng)一個團隊開發(fā)新的產(chǎn)品。不幸的是,你的產(chǎn)品的最新版本沒有通過質(zhì)量檢測。由于每個版本都是基于之前的版本開發(fā)的,所以錯誤的版本之后的所有版本都是錯的。

假設(shè)你有 n 個版本 [1, 2, ..., n],你想找出導(dǎo)致之后所有版本出錯的第一個錯誤的版本。

你可以通過調(diào)用 bool isBadVersion(version) 接口來判斷版本號 version 是否在單元測試中出錯。實現(xiàn)一個函數(shù)來查找第一個錯誤的版本。你應(yīng)該盡量減少對調(diào)用 API 的次數(shù)。

示例 1:

輸入:n = 5, bad = 4
輸出:4
解釋:
調(diào)用 isBadVersion(3) -> false
調(diào)用 isBadVersion(5) -> true
調(diào)用 isBadVersion(4) -> true
所以,4 是第一個錯誤的版本。
示例 2:

輸入:n = 1, bad = 1
輸出:1

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/first-bad-version
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

解題思路及方法

這道題有點意思,雖然用了二分查找,但其實是找二分查找的轉(zhuǎn)折點。二分的時候?qū)懛☉?yīng)該是mid = left + (right - left) / 2,這樣可以防止越界。然后判斷isBadVersion(mid),如果為真,說明當(dāng)前mid是錯誤版本,第一個錯誤版本應(yīng)該在左邊,包含mid本身,所以right = mid;否則為假,說明第一個錯誤版本在mid右邊,不包括mid,left = mid + 1。循環(huán)的終止條件是left = right,即找到答案,隨便返回即可。
這個二分法講的挺好:鏈接

/* 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 (left < right) {
            int mid = left + (right - left) / 2;
            if (isBadVersion(mid)) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }

        return left;
    }
}

結(jié)果如下:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容