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