数组 -二分查找

69 阅读1分钟

题目 LC704

左闭右闭 写法

public static 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;
    }
}
​
// 如果未找到目标值,返回 -1
return -1;
​
}

左闭右开 写法

public static 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
return -1;
​
}

int mid = (left + right) / 2 与 left + (right - left) / 2 后者更好