Skip to content

Latest commit

 

History

History
120 lines (98 loc) · 2.68 KB

20220517.md

File metadata and controls

120 lines (98 loc) · 2.68 KB

Algorithm

704. Binary Search

Description

Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.

You must write an algorithm with O(log n) runtime complexity.

Example 1:

Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4

Example 2:

Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1

Constraints:

  • 1 <= nums.length <= 104
  • -104 < nums[i], target < 104
  • All the integers in nums are unique.
  • nums is sorted in ascending order.

Solution

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        while(left<=right){
            // 这里是为了防止溢出
            int mid = left + (right-left)/2;
            // 下面尽量用if else, 避免出现else
            if(nums[mid] == target){
                return mid;
            }else if(nums[mid] < target){
                left = mid + 1;
            }else if(nums[mid] > target){
                right = mid - 1;
            }
        }
        return -1;
    }
}

查找左侧边界的二分查找

class Solution {
    public int searchLeft(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){
                left = mid + 1;
            }else if(nums[mid] > target){
                right = mid - 1;
            }else if(nums[mid] == target){
                // 继续查找左侧边界
                right = mid - 1;
            }
        }
        // 检查数组越界
        if(left >= nums.length || nums[left] != target){
           return -1;
        }
        return left;
    }
}

查找右侧边界的二分查找

class Solution {
    public int searchRight(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){
                right = mid - 1;
            }else if(nums[mid] < target){
                left = mid + 1;
            }else if(nums[mid] == target){
                // 继续查找右侧边界
                left = mid + 1;
            }
        }
        // 检查数组越界
        if(right < 0 || nums[right] != target){
           return -1;
        }
        return right;
    }
}

Discuss

Review

Tip

Share