一. 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
示例 4:
输入: nums = [1,3,5,6], target = 0
输出: 0
示例 5:
输入: nums = [1], target = 0
输出: 0
class Solution {
public int searchInsert(int[] nums, int target) {
//左边界
int start = 0;
//右边界
int end = nums.length-1;
while(start < end){
//取中位数和目标数进行对比
int mid = start + (end - start)/2;
if(nums[mid] > target){
//如果大于则右边界移到mid的位置
end = mid ;
}else if(nums[mid] < target){
//如果小于左边界往前移动一位(如果等于中位下标可能会照成越界)
start = mid + 1;
}else{
return mid;
}
}
//不存在有两种情况 1 如果右边界大于目标数则需要插入到右边界的位置
//2.如果右边界小于目标数则需要插入到右边界的位置+1
if(nums[end] < target){
return end + 1 ;
}
return end;
}
}
思路:首先查看目标值在不在数组中需要用二分法去查看,如果跳出了数组循环说明目标数不在数组内,则需要目标数和已更改的数组右边界进行比较,如果大于就插入到当前位置,如果小于就插入到右边界+1的位置.
二.
假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例 1:
输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
示例 2:
输入:n = 1, bad = 1
输出:1
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;
}else{
left = mid + 1;
}
}
//当left = right = bad的时候就说明错误版本和左右边界一致
return left;
}
}
思路:此题是按顺序的查找指定数在数组中的位置的题,需要用到二分法去进行查找,题干需要少调用,因此使用二分法是最好的解题思路,使用数组遍历会使运算次数增加.