1.第一个错误的版本
分析:第一个错误的版本的编号左边全是正确的,右边全是错误的,每次都依据左右边界找到中间位置,如果此位置是错误版本,就缩紧右边界,看看该位置左边还有没有错误版本,直到找到第一个错误版本,如果此位置不是错误版本,就证明错位版本的编号在此位置之后,所以继续搜索此位置之后的,缩紧左边界,最后返回的值自己手动检验一下,二分水题
/* 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;
int right=n;
while(left<=right)
{
int mid=left+(right-left)/2;
if(isBadVersion(mid))
{
right=mid-1;
}
else
{
left=mid+1;
}
}
return left;
}
}
2.搜索插入位置
分析:找比目标数大的第一个位置,设坐标为a,判断a-1,如果等于返回a-1,否则返回a,找第一个位置的方法还是缩紧边界,和上一题差不多的
class Solution {
public int searchInsert(int[] nums, int target) {
//找比目标数大的第一个位置,设坐标为a,判断a-1,如果等于返回a-1,否则返回a
int left=0;
int ans=0;
int right=nums.length-1;
int flag=0;
while(left<=right)
{
int mid=left+(right-left)/2;
if(nums[mid]==target)
{
flag=1;
ans=mid;
break;
}
else if(nums[mid]<target)
{
left=mid+1;
}
else if(nums[mid]>target)
{
right=mid-1;
}
}
if(flag==1)
return ans;
return left;
}
}