C++ 区间查找

给定一个排序数组nums(nums中有重复元素)与目标值target,如果target在nums里出现,则返回target所在区间的左右端点下标,[左端点,右端点],如果target在nums里未出现,则返回[-1,-1]。
例如:
下标 =[0,1, 2,3,4, 5,6, 7]
nums=[5, 7,7, 8,8,8,8,10]

targe=8,则返回[3,6]
target=6, 则返回[-1,-1]

#include<vector>
class Solution
{
public:
 Solution() {}
 ~Solution() {}
 std::vector<int> searchRange(std::vector<int> &nums, int target)
 {
  std::vector<int> result;
  result.push_back(left_bound(nums, target));
  result.push_back(right_bound(nums, target));
  return result;
 }
private:
 int left_bound(std::vector<int>& nums, int target)
 {
  int begin = 0;
  int end = nums.size() - 1;
  while (begin <= end)
  {
   int mid = (begin + end) / 2;
   if (target == nums[mid])
   {
    if (mid == 0 || target > nums[mid - 1])
    {
     return mid;
    }
    end = mid - 1;
   }
   else if (target < nums[mid])
   {
    end = mid - 1;
   }
   else if (target > nums[mid])
   {
    begin = mid + 1;
   }
  }
  return -1;
 }
 int right_bound(std::vector<int> &nums, int target)
 {
  int begin = 0;
  int end = nums.size() - 1;
  while (begin<=end)
  {
   int mid = (begin + end) / 2;
   if (target==nums[mid])
   {
    if (mid==nums.size()-1||target<nums[mid+1])
    {
     return mid;
    }
    begin = mid + 1;
   }
   else if (target<nums[mid])
   {
    end = mid - 1;
   }
   else if (target>nums[mid])
   {
    begin = mid + 1;
   }
  }
  return -1;
 }
};
int main()
{
 int test[] = { 5,7,7,8,8,8,8,10 };
 std::vector<int> nums;
 Solution solve;
 for (int i = 0; i < sizeof(test)/sizeof(test[0]); i++)
 {
  nums.push_back(test[i]);
 }
 for (int  i = 0; i < 12; i++)
 {
  std::vector<int> result = solve.searchRange(nums, i);
  printf("%d: [%d,  %d]\n", i, result[0], result[1]);
 }
 return 0;
}

运行结果为:

0: [-1,  -1]
1: [-1,  -1]
2: [-1,  -1]
3: [-1,  -1]
4: [-1,  -1]
5: [0,  0]
6: [-1,  -1]
7: [1,  2]
8: [3,  6]
9: [-1,  -1]
10: [7,  7]
11: [-1,  -1]
发布了79 篇原创文章 · 获赞 62 · 访问量 2209

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/104965691