力扣 题目34-- 在排序数组中查找元素的第一个和最后一个位置
题目
题解
改造二分搜索 具体说明在代码注释
代码
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 vector<int> ersearch(vector<int>& nums, int target, int left, int right) 5 { 6 vector<int>result; 7 while (left <= right) { 8 int middle = left + ((right - left) / 2); 9 if (nums[middle] > target) { 10 right = middle - 1; 11 } 12 else if (nums[middle] < target) { 13 left = middle + 1; 14 } 15 else { 16 //这里找到其中一个元素 但是他不一定是最后一个或者是第一个 17 //备份一下 18 int backups = middle; 19 //判断一下他的上一个是target?如果是则更新 这样就能找到最小 20 while (middle != 0 && nums[middle] == nums[middle - 1]) { 21 middle--; 22 } 23 //放入最小 24 result.push_back(middle); 25 //判断一下他的下一个是target?如果是则更新 这样就能找到最大 26 while (backups != nums.size()-1 && nums[backups] == nums[backups + 1]) { 27 backups++; 28 } 29 //放入最大 30 result.push_back(backups); 31 return result; 32 } 33 } 34 //如果没有 就返回-1 -1 35 return {-1,-1 }; 36 } 37 38 class Solution { 39 public: 40 vector<int> searchRange(vector<int>& nums, int target) { 41 //调用二分搜索 42 return ersearch(nums, target, 0, nums.size()-1); 43 } 44 }; 45 46 47 int main() { 48 Solution sol; 49 vector<int> nums = { 5,7,7,8,8,10 }; 50 int target = 5; 51 vector<int> result=sol.searchRange(nums, target); 52 for (int i = 0; i < result.size();i++) { 53 cout << result[i] << endl;; 54 } 55 }