LeetCode-34.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].

三次二分查找,先找到一个目标元素,然后再向左和向右查找

public int[] SearchRange(int[] nums, int target)
        {
            int n = nums.Length;
            int[] res = new int[2] { -1, -1 };
            if (nums[0] > target || nums[n - 1] < target)
                return res;
            int start = 0, end = n - 1, mid=0;
            while (start<=end)
            {
                mid = (start + end) / 2;
                if (nums[mid] == target)
                {
                    res[0] = res[1] = mid;
                    break;
                }
                if (nums[mid] < target)
                    start = mid + 1;
                else
                    end = mid - 1;
            }

            if (res[0] == -1)
                return res;

            start = 0;
            end = res[0];
            while (start <= end)
            {
                mid = (start + end) / 2;
                if (nums[mid] == target)
                    end = mid - 1;
                else
                    start = mid + 1;
            }
            res[0] = start;

            start = res[1];
            end = n-1;
            while (start <= end)
            {
                mid = (start + end) / 2;
                if (nums[mid] == target)
                    start = mid + 1;
                else
                    end = mid - 1;
            }
            res[1] = end;
            return res;
        }

方法2 只用两次二分

对于效率是否更高?似乎还是要考虑输入。因为如果不存在目标数,则方法1只需一次二分,存在时需要三次,方法2都是需要两次二分

public int[] SearchRange(int[] nums, int target) 
    {
        int n = nums.Length;
        int[] res = new int[2] { -1, -1 };
        if (nums[0] > target || nums[n - 1] < target)
            return res;
        int start1 = 0, end1 = n - 1, mid=0;
        while (start1 <= end1)
        {
            mid = (start1 + end1) / 2;
            if (nums[mid] >= target)
                end1 = mid - 1;
            else
                start1 = mid + 1;
        }

        int start2 = 0, end2 = n - 1;
        while (start2 <= end2)
        {
            mid = (start2 + end2) / 2;
            if (nums[mid] <= target)
                start2 = mid + 1;
            else
                end2 = mid - 1;
        }
        if (start1 <= end2)
        {
            res[0] = start1;
            res[1] = end2;
        }
        return res;
    }

方法2 参考  http://blog.csdn.net/linhuanmars/article/details/20593391


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值