力扣算法基础二分法题

一. 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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;
    }
}

思路:此题是按顺序的查找指定数在数组中的位置的题,需要用到二分法去进行查找,题干需要少调用,因此使用二分法是最好的解题思路,使用数组遍历会使运算次数增加.

你可能感兴趣的:(力扣刷题,算法,数据结构,线性代数)