【leetcode】278. 第一个错误的版本

题目内容

278. 第一个错误的版本

思路分析

本题是一道二分查找题目,掌握二分查找的写法后写起来比较简单。关于二分查找的写法可以见我写了首诗,让你闭着眼睛也能写对二分搜索,可以说讲的非常清楚。

方法一:找左侧边界的二分查找

基本上按模板来就行,和模板不同的是本题的查找只有是和不是两种状态,而非平时的大于/小于/等于;另外,本题的序号是从1开始的,而且不像平时的查找会出现left指针越界的情况。

代码

#include <vector>
#include <math.h>
#include <limits.h>

using namespace std;

// The API isBadVersion is defined for you.
// bool isBadVersion(int version);

bool isBadVersion(int version) {
   return version == 4 ? true : false;
}

// 找左侧边界的二分查找
// 时间复杂度O(logn)
// 空间复杂度O(1)
// https://labuladong.gitbook.io/algo/mu-lu-ye/er-fen-cha-zhao-xiang-jie
class Solution {
public:
    int firstBadVersion(int n) {
        int mid, left = 1, right = n; // 注意到版本号从1开始

        while (left <= right) {
           mid = left + (right - left) / 2; // 防止整数溢出
           if (isBadVersion(mid)) {
              right = mid - 1;
           } else {
              left = mid + 1; 
           }
        }
        
        // 闭区间本来要检查left是否溢出,但由于此题的特性,不检查
        
        return left;
    }
};

int main() {
   Solution s;
   int input{ 5 };
   int result = s.firstBadVersion(input);
   int a = 0;
}

收获

  • 基本掌握了二分查找的写法