博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[leetcode]278. First Bad Version首个坏版本
阅读量:5105 次
发布时间:2019-06-13

本文共 2297 字,大约阅读时间需要 7 分钟。

You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad.

Suppose you have n versions [1, 2, ..., n] and you want to find out the first bad one, which causes all the following ones to be bad.

You are given an API bool isBadVersion(version) which will return whether version is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.

Given n = 5call isBadVersion(3) -> falsecall isBadVersion(5) -> truecall isBadVersion(4) -> trueThen 4 is the first bad version.

 

题意:

 

思路:

二分查找。 

注意的是,每个人的二分查找模板可能都不同。

源于对left和right的初始化不同。一旦定义好了left和right的区间,就要在之后的代码里维护好这个区间。

举例,

 

定义好left = 0, right = n-1, 则在[left...right] 范围内找target,极端情况下left会一直靠向right直至等于right。 

1   private int binarySearch2(int n, int[]arr, int target){ 2         int l = 0, r = n-1 ; 3         while(l <= r){ 4             int mid = l+(r-l)/2; 5             if(arr[mid] == target){ 6                 return mid; 7             }else if(target > arr[mid]){ 8                 l = mid + 1; 9             }else {10                 r = mid-1 ;11             }12         }13         return -1;14     }

定义好left = 0, right = n, 则在 [left...right) 范围内找target,极端情况下left会一直靠向right但不能等于right。 

1    private int binarySearch(int n, int[]arr, int target){ 2         int l = 0, r = n ; 3         while(l < r){ 4             int mid = l+(r-l)/2; 5             if(arr[mid] == target){ 6                 return mid; 7             }else if(target > arr[mid]){ 8                 l = mid + 1; 9             }else {10                 r = mid ;11             }12         }13         return -1;14     }

 

当然, 与此相对应的,也可以初始化 left = -1, 思路一致。 选择一套自己好理解的模板,白子偕老。

 

代码:

1 public class FirstBadVersion { 2     public int firstBadVersion(int n) { 3         int left = 1, right = n - 1; 4         while (left <= right) { 5             int mid = left + (right - left) / 2; 6             if (!isBadVersion(mid)) { 7                 left = mid + 1; 8             } else { 9                 right = mid - 1;10             }11         }12         return left;13     }14 }

 

转载于:https://www.cnblogs.com/liuliu5151/p/9120785.html

你可能感兴趣的文章
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
pycharm 如何设置方法调用字体颜色
查看>>
VUE源码解析心得
查看>>
[HDU3683 Gomoku]
查看>>
【工具相关】iOS-Reveal的使用
查看>>
整体二分——[Poi2011]Meteors
查看>>
数据库3
查看>>
delphi之事件
查看>>
windows server 2008 r2 安装
查看>>
Enigma –> Sadness
查看>>
存储分类
查看>>
下一代操作系统与软件
查看>>
【iOS越狱开发】如何将应用打包成.ipa文件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Hat’s Words (分成两个字符串考虑)
查看>>
Yii2 Lesson - 03 Forms in Yii
查看>>
Python IO模型
查看>>
Ugly Windows
查看>>
DataGridView的行的字体颜色变化
查看>>