问题描述
解决方法
二分搜索
这其实是一道非常简单的题目,我主要记录一下这道题特殊的二分搜索方式。
普通的二分搜索是这样的,一般是从一个有序数组中找到是否存在一个值,一般的操作方法是初始规定
l
e
f
t
=
0
,
r
i
g
h
t
=
n
−
1
left=0,right=n-1
left=0,right=n−1,然后计算
m
i
d
=
(
l
e
f
t
+
r
i
g
h
t
)
/
2
mid=(left+right)/2
mid=(left+right)/2,更新的时候按照
l
e
f
t
=
m
i
d
+
1
left=mid+1
left=mid+1或者
r
i
g
h
t
=
m
i
d
−
1
right=mid-1
right=mid−1进行。
而这道题目不太一样,他是要从一个只有正确和错误的连续数组中找到分界点,对于这种找分界点的问题,需要采用本题中的二分方法,即初始
m
i
d
=
l
e
f
t
+
(
r
i
g
t
h
−
l
e
f
t
)
/
2
mid=left+(rigth-left)/2
mid=left+(rigth−left)/2,更新边界时是
r
i
g
h
t
=
m
i
d
,
l
e
f
t
=
m
i
d
+
1
right=mid, left=mid+1
right=mid,left=mid+1。这种方法可以防止整形类型数值溢出。注意,使用这种方法必须是
l
e
f
t
+
1
left+1
left+1,因为整数取整都是下取整,很容易到达下边界,如果
l
e
f
t
left
left不能更新数值的话会陷入死循环。代码如下
class Solution {
public:
int firstBadVersion(int n) {
int left=1;
int right=n;
while(left<right){
int mid = left + (right-left)/2;
if(isBadVersion(mid)) right = mid;
else left = mid+1;
}
return left;
}
};