第一题 错误版本278
**@Date 2022年1月14日
假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。
实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
**
package day1二分;
public class 错误版本278 {
/* The isBadVersion API is defined in the parent class VersionControl.
boolean isBadVersion(int version); */
public int firstBadVersion(int n) {
int left = 1;
int right = n;
while(left < right) {//循环至left=right,循环结束
int mid = left +(right - left)/2;//防止溢出
if(isBadVersion(mid)) {
right = mid;//说明前面的都已经有了出错的
}else {
left = mid + 1;//答案在
}
}
return left;
/*
int firstBadVersion(int n) {
if (n == 1) return 1;
int low = 1, high = n, mid;
while(low < high) {
mid = low + (high-low) / 2;
if (isBadVersion(mid))
high = mid;
else low = mid + 1;
}
return low;
}
*/
}
private boolean isBadVersion(int mid) {
// TODO Auto-generated method stub
return false;
}
}
第二题 二分搜索704
@Date 2022年1月14日
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,
写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
package day1二分;
public class 二分搜索704 {
public static void main(String[] args) {
int[] nums = {-1,0,3,5,9,12};
int target = 9;
int res = search(nums,target);
System.out.println(res);
}
public static int search(int[] nums, int target) {
int low = 0;
int high = nums.length -1; //注意
while(low<=high){ //注意<=
int cen = low + (high - low)/2;//防止low+high造成溢出
if(target == nums[cen]){
return cen;
}else if(target < nums[cen]){
high = cen - 1;//注意
}else if (target > nums[cen]) {
low = cen + 1;//注意
}
}
return -1;
}
}
第三题 搜索插入位置35
@Date 2022年1月14日
给定一个 排序数组 和一个 目标值,在数组中找到目标值,并返回其索引。
如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
package day1二分;
public class 搜索插入位置35 {
public static void main(String[] args) {
int[] nums = {-1,0,3,5,9,12};
int target = 8;
int res = searchInsert(nums,target);
System.out.println(res);
}
public static int searchInsert(int[] nums, int target) {
int left = 0,right = nums.length-1 ,mid;
while(left <= right ) {
mid = left + (right - left)/2;
if(nums[mid] == target) {
return mid;
}else if (nums[mid] < target) {
left = mid + 1;
}else if (nums[mid] > target) {
right = mid - 1;
}
}
return right+1;//相当于未找到的时候直接返回下一个(和left一样)
}
}