1 #include "000库函数.h" 2 3 //使用二分法查找到目标值的位置,然后分两边再查找出起始位置和终止位置 4 //16ms 不是严格意义上的logn的复杂度 5 class Solution { 6 public: 7 vector<int> searchRange(vector<int>& nums, int target) { 8 vector<int>v = { -1,-1 }; 9 int i = 0, j = nums.size() - 1; 10 int m = -1; 11 while (i <= j) { 12 int t = (i + j) / 2; 13 if (nums[t] == target) { 14 m = t; 15 break; 16 } 17 if (nums[t] > target) j = t - 1; 18 else i = t + 1; 19 } 20 if (m == -1) return v; 21 int t = m; 22 while (t >= 0 && nums[t] == target) --t; 23 v[0] = (t + 1); 24 t = m; 25 while (t < nums.size() && nums[t] == target) ++t; 26 v[1] = (t - 1); 27 return v; 28 } 29 }; 30 31 //复杂度满足logn 32 class Solution { 33 public: 34 vector<int> searchRange(vector<int>& nums, int target) { 35 vector<int> res(2, -1); 36 if (nums.size() == 0)return res; 37 int left = 0, right = nums.size() - 1; 38 while (left < right) { 39 int mid = left + (right - left) / 2; 40 if (nums[mid] < target) left = mid + 1;//使用这种判断,会找到最左边的目标值 41 else right = mid; 42 } 43 if (nums[right] != target) return res; 44 45 res[0] = right; 46 right = nums.size(); 47 while (left < right) { 48 int mid = left + (right - left) / 2; 49 if (nums[mid] <= target) left = mid + 1;//使用这种判断,会找到最右边的目标值 50 else right = mid; 51 } 52 res[1] = left - 1; 53 return res; 54 } 55 }; 56 void T034() { 57 Solution s; 58 vector<int >n; 59 n = { 8 }; 60 n = s.searchRange(n, 8); 61 cout << n[0] << " " << n[1] << endl; 62 n = { 5,7,7,8,8,10 }; 63 n = s.searchRange(n, 9); 64 cout << n[0] << " " << n[1] << endl; 65 n = { 5,7,7,8,8,8,10 }; 66 n = s.searchRange(n, 8); 67 cout << n[0] << " " << n[1] << endl; 68 n = { 1,1,1,1,1,1}; 69 n = s.searchRange(n,1); 70 cout << n[0] << " " << n[1] << endl; 71 72 }