Advertisement
Guest User

Untitled

a guest
Feb 16th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. int bs_find_idx(const vector<int>& nums, int b, int e, int pos_eq, bool is_ub) {
  2.   int res = pos_eq;
  3.   int target = nums[pos_eq];
  4.   while (b <= e) {
  5.     int mid = b + (e - b) / 2;
  6.     int x = nums[mid];
  7.     if (x > target) {
  8.       e = mid - 1;
  9.     } else if (x < target) {
  10.       b = mid + 1;
  11.     } else {
  12.       if (is_ub) {
  13.         b = mid + 1;
  14.         res = max(res, mid);
  15.       } else {
  16.         e = mid - 1;
  17.         res = min(res, mid);
  18.       }
  19.     }
  20.   }
  21.   return res;
  22. }
  23.  
  24. int find_lb(const vector<int>& nums, int mid) {
  25.   // int min = mid;
  26.   // int x = nums[mid];
  27.   // for (int i = mid; i >= 0; i--) {
  28.   //   if (nums[i] != x) {
  29.   //     break;
  30.   //   }
  31.   //   min = i;
  32.   // }
  33.   // return min;
  34.   return bs_find_idx(nums, 0, mid, mid, /*is_ub=*/false);
  35. }
  36.  
  37. int find_ub(const vector<int>& nums, int mid) {
  38.   // int max = mid;
  39.   // int x = nums[mid];
  40.   // for (int i = mid; i < nums.size(); i++) {
  41.   //   if (nums[i] != x) {
  42.   //     break;
  43.   //   }
  44.   //   max = i;
  45.   // }
  46.   // return max;
  47.   return bs_find_idx(nums, mid, nums.size() - 1, mid, /*is_ub=*/true);
  48. }
  49.  
  50. class Solution {
  51. public:
  52.   vector<int> searchRange(const vector<int>& nums, int target) {
  53.     // [b, e]
  54.     int b = 0;
  55.     int e = nums.size() - 1;
  56.     while (b <= e) {
  57.       int mid = b + (e - b) / 2;
  58.       int x = nums[mid];
  59.       if (x < target) {
  60.         b = mid + 1;
  61.       } else if (x > target) {
  62.         e = mid - 1;
  63.       } else {
  64.         int min = find_lb(nums, mid);
  65.         int max = find_ub(nums, mid);
  66.         return {min, max};
  67.       }
  68.     }
  69.     return {-1, -1};
  70.   }
  71. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement