Day01 二分查找

83 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1 704.二分查找

1.1 题目

在这里插入图片描述

1.2 题解

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else
                right = mid - 1;
        }

        if (left > right) {
            return -1;
        }
        return left;
    }
}

2 278. 第一个错误的版本

2.1 题目

在这里插入图片描述

2.2 题解

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;
        }
        return left;
    }
}

3 35. 搜索插入位置

3.1 题目

在这里插入图片描述

3.2 题解

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else
                right = mid - 1;
        }
        // 没有找到就是left==right的情形,该位置即为需要插入的位置
        return left;
    }
}

4 总结

4.1 二分查找模板

	public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else
                right = mid - 1;
        }

        if (left > right) {
            return -1;
        }
        return left;
    }

4.2 二分查找变形

二分查找是在一个有序的数组中进行元素的查找某一个元素,二分查找的变形有如下(当然还有很多其他的变形):

  • 类型[********########]这样的有序数组,寻找第一个#号的下标。
  • 类型[********########]这样的有序数组,在第一个#号处插入元素。

注:关键在于while中条件的构造,终止条件是left<right