您的位置:首页 > 其它

给定按升序排序的整数数组,找到给定目标值的开始和结束位置。 如果在数组中找不到目标,则返回[-1,-1]。

2017-12-08 09:47 369 查看
本题源自leetcode  34

-----------------------------------------------------------

思路:用二分查找的思路,首先找出最左边的target,就是当target <= num【mid】 end = mid;

2 然后 第一次循环结束后判断 start 等于 target,就是最左边的。然后找最右边的target  一样用 二分查找的方法

代码:

vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
vector<int> ret(2, -1);
if(n == 0)
return ret;
int i = 0, j = n - 1;
while (i < j) //找最左边的
{
int mid = (i + j) /2;
if (nums[mid] < target)
i = mid + 1;
else
j = mid;
}
if (nums[i]!=target)
return ret;
else
ret[0] = i;

// 找最右边的
j = n-1; //
while (i < j)

4000
{
int mid = (i + j) /2 +1 ; // 让中间点基于右边
if (nums[mid] > target)
j = mid - 1;
else
i = mid;
}
ret[1] = j;
return ret;
}思路 2  用 stl的函数
代码:

vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
vector<int> res(2,-1);
if(n == 0)
return res;
int lo = lower_bound(nums.begin(),nums.end(),target)-nums.begin();
if(lo == n || nums[lo] != target)
return res;
res[0] = lo;
int hi = upper_bound(nums.begin(),nums.end(),target) - nums.begin() -1;
res[1] = hi;
return res;
}

思路3 :
代码;

int n = nums.size();
vector<int> res(2,-1);
if(n == 0)
return res;
int lo = 0;
int hi = n-1;
int idx = -1;
while(lo <= hi){ //求 最左边的 target
int mid = (lo + hi) >> 1;
if(nums[mid] >= target)
hi = mid - 1;
else
lo = mid + 1;
if(nums[mid] == target)
idx = mid;
}
res [0] = idx;
// lo = 0;
hi = n-1;
while(lo <= hi){ //最右边的target
int mid = (lo + hi) >> 1;
if(nums[mid] <= target)
lo = mid + 1;
else
hi = mid - 1;
if(nums[mid] == target)
idx = mid;
}
res[1] = idx;
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐