码迷,mamicode.com
首页 > 其他好文 > 详细

Search for a range, 在一个可能有重复元素的有序序列里找到指定元素的起始和结束位置

时间:2016-06-11 15:49:44      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

问题描述:给定一个有序序列,找到指定元素的起始和结束位置。例如:1234555,5,起始4结束6

算法分析:其实就是一个二分查找的利用。但是特殊就在不是找到某个元素,而是找到下标。也就是在nums[mid]=target时,要分析mid的左右元素。

public int[] searchRange(int[] nums, int target)
    {
        if(nums == null || nums.length == 0)
        {
            return null;
        }
        int[] arr = {-1,-1};
        binarySearch(nums, 0, nums.length - 1, target, arr);
        return arr;
    }
    
    public void binarySearch(int[] nums, int left, int right, int target, int[] arr)
    {
        int mid = (left + right)/2;
        if(left > right)
        {
            return;
        }
        if(nums[left] == target && nums[right] == target)//特例
        {
            arr[0] = left;
            arr[1] = right;
            return;
        }
        if(nums[mid] == target)
        {
            int templ = mid, tempr = mid;
            while(templ>=left && nums[templ]==target)
            {
                templ --;
            }
            arr[0] = templ+1;
            while(tempr<=right && nums[tempr]==target)
            {
                tempr ++;
            }
            arr[1] = tempr-1;
        }
        else if(nums[mid] < target)
        {
            binarySearch(nums, mid + 1, right, target, arr);
        }
        else
        {
            binarySearch(nums, left, mid - 1, target, arr);
        }
    }

 

Search for a range, 在一个可能有重复元素的有序序列里找到指定元素的起始和结束位置

标签:

原文地址:http://www.cnblogs.com/masterlibin/p/5575302.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!