二分与排序简单2 种解法

#704二分查找

在严格升序数组中查找 target,存在则返回下标,否则返回 -1。

#数组#二分查找

解题主线

01

闭区间写法始终维护答案若存在则位于 [left, right],循环条件必须是 left <= right。

解法 1迭代二分

比较中点后排除不可能包含目标的一半闭区间。

时间复杂度

O(log n)

空间复杂度

O(1)

704. 二分查找 · 迭代二分
final class Solution {
    public int search(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int middle = left + (right - left) / 2;
            if (nums[middle] == target) return middle;
            if (nums[middle] < target) left = middle + 1;
            else right = middle - 1;
        }
        return -1;
    }
}

比较中点后排除不可能包含目标的一半闭区间。

解法 2递归二分

递归传递仍可能包含目标的闭区间,区间为空时失败。

时间复杂度

O(log n)

空间复杂度

O(log n),递归栈

704. 二分查找 · 递归二分
final class Solution {
    public int search(int[] nums, int target) {
        return search(nums, target, 0, nums.length - 1);
    }

    private int search(int[] nums, int target, int left, int right) {
        if (left > right) return -1;
        int middle = left + (right - left) / 2;
        if (nums[middle] == target) return middle;
        if (nums[middle] < target) return search(nums, target, middle + 1, right);
        return search(nums, target, left, middle - 1);
    }
}

递归传递仍可能包含目标的闭区间,区间为空时失败。

边界与易错点

  • 中点使用 left + (right - left) / 2 避免加法溢出。
  • Q074_binarySearch 的题意实际是 LeetCode 704,不是 74,已与 Q704 合并。
整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

easy/Q074_binarySearch.javaeasy/Q704_binarysearch.java