力扣 题目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 }
View Code

 

posted @ 2022-04-24 12:50  无聊的阿库娅  阅读(13)  评论(0编辑  收藏  举报