LeetCode-34.Search for a Range

来源:互联网 发布:java初学者书籍推荐 编辑:程序博客网 时间:2024/06/13 15:37

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
原创粉丝点击