Search for a Range

来源:互联网 发布:gif软件 电脑 编辑:程序博客网 时间:2024/06/03 20:21

原题:

Given an array of integers sorted in ascending order, 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].

即从给定数组中找到值为target的元素,返回这些元素下标的最小值和最大值。


思考过程&解题思路:

排好序的数组找元素用二叉搜索会使复杂度为o(logn)。一开始想到二叉搜索找到target之后从它两边开始遍历,判断是否值仍为target,最后返回结果。如果给定数组是{8,8,8,8,8,8,88,8,8,...,8},taget是8,复杂度岂不是o(n),提交了一下发现过了。估计也不会有这样无聊的数据。


结果代码:

public int[] searchRange(int[] nums, int target) {        if (nums.length == 0) return new int[]{-1,-1};        return binarySearch(nums,0,nums.length - 1,target);    }    public int[] binarySearch(int nums[],int begin,int end,int target){        int midium = (begin + end) / 2;        if (midium == begin) {            if (nums[midium] == target) return findRange(nums,midium,target);            if (nums[end] == target) return findRange(nums,end,target);            else return new int[]{-1,-1};        }        if (target > nums[midium]) return binarySearch(nums,midium,end,target);        else return binarySearch(nums,begin,midium,target);    }    public int[] findRange(int[] nums,int center,int target){        int begin = center,end = center;        while (begin > 0 && nums[begin - 1] == target) begin--;        while (end < nums.length - 1 && nums[end + 1] == target) end ++;        return new int[]{begin,end};    }

原创粉丝点击