二分查找法

1. 描述

要求:

  1. 数组 2. 有序

2. 代码

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) { //nums=[1] target=1 => left=0 right=0
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }
}

3. 时间、空间复杂度

时间复杂度:O(logn)
空间复杂度:O(1)

4. 附录

4.1 查找左边第一个元素

nums = [5,7,7,8,8,10], target = 7
result = 1

    int findLeftLocation(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1; // 初始化 right 为最后一个有效索引
        while (left <= right) { // 循环条件改为 left 小于等于 right
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                right = mid - 1; // 移动 right 到 mid - 1 以找到最左边的 target
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        // 检查 left 是否在数组范围内且 nums[left] 是否等于 target
        if (left >= nums.length || nums[left] != target) {
            return -1;
        }
        return left;
    }

4.1 查找右边第一个元素

nums = [5,7,7,8,8,10], target = 7
result = 2

    int findRightLocation(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1; // 初始化 right 为最后一个有效索引
        while (left <= right) { // 循环条件改为 left 小于等于 right
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                left = mid + 1; // 移动 left 到 mid + 1 以找到最右边的 target
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        // 检查 right 是否在数组范围内且 nums[right] 是否等于 target
        if (right < 0 || nums[right] != target) {
            return -1;
        }
        return right;
    }

posted @   帅气的涛啊  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示

目录