当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

[Leetcode] Search for a Range 寻找区间

作者:小梦 来源: 网络 时间: 2024-01-31 阅读:

Search for a Range

Given a sorted array of integers, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example, Given [5, 7, 7, 8, 8, 10] and target value 8, return [3, 4].

二分搜索

复杂度

时间 O(logN) 空间 O(1)

思路

其实就是执行两次二分搜索,一次专门找左边边界,一次找右边边界。特别的,如果找左边边界时,要看mid左边一位的的数是否和当前mid相同,如果相同要继续在左半边二分搜索。如果找右边边界,则要判断右边一位的数是否相同。

代码

public class Solution {    public int[] searchRange(int[] nums, int target) {        // 找到左边界        int front = search(nums, target, "front");        // 找到右边界        int rear = search(nums, target, "rear");        int[] res = {front, rear};        return res;    }        public int search(int[] nums, int target, String type){        int min = 0, max = nums.length - 1;        while(min <= max){int mid = min + (max - min) / 2;if(nums[mid] > target){    max = mid - 1;} else if(nums[mid] < target){    min = mid + 1;} else {    // 对于找左边的情况,要判断左边的数是否重复    if(type == "front"){        if(mid == 0) return 0;        if(nums[mid] != nums[mid - 1]) return mid;        max = mid - 1;    } else {    // 对于找右边的情况,要判断右边的数是否重复        if(mid == nums.length - 1) return nums.length - 1;        if(nums[mid] != nums[mid + 1]) return mid;        min = mid + 1;    }}        }        //没找到该数返回-1        return -1;    }}

热点阅读

网友最爱