Skip to content

Commit 8f35d95

Browse files
committed
Add Solution CPP[34]
1 parent 1c38ac7 commit 8f35d95

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
## 在排序数组中查找元素的第一个和最后一个位置
2+
3+
### 问题描述
4+
5+
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
6+
7+
你的算法时间复杂度必须是 O(log n) 级别。
8+
9+
如果数组中不存在目标值,返回 [-1, -1]
10+
11+
```
12+
示例 1:
13+
输入: nums = [5,7,7,8,8,10], target = 8
14+
输出: [3,4]
15+
16+
示例 2:
17+
输入: nums = [5,7,7,8,8,10], target = 6
18+
输出: [-1,-1]
19+
```
20+
21+
### 思路
22+
23+
二分查找找下标,找到下标对其左右查找是否等于目标值就好了
24+
25+
```CPP
26+
27+
class Solution {
28+
public:
29+
bool binarySearch(vector<int> &nums,int &target,int &pos,int left,int right){
30+
int mid = left + ((right - left) >> 1);
31+
if(nums[left] == target){
32+
pos = left;
33+
return true;
34+
}
35+
if(nums[right] == target){
36+
pos = right;
37+
return true;
38+
}
39+
if(nums[mid] == target){
40+
pos = mid;
41+
return true;
42+
}
43+
44+
if(left == mid){
45+
return false;
46+
}
47+
else if(nums[mid] > target){
48+
return binarySearch(nums,target,pos,left,mid-1);
49+
}
50+
else if(nums[mid] < target){
51+
return binarySearch(nums,target,pos,mid+1,right);
52+
}
53+
54+
return false;
55+
}
56+
57+
vector<int> searchRange(vector<int>& nums, int target) {
58+
int pos = 0;
59+
int len = nums.size();
60+
if(len == 0)return {-1,-1};
61+
if(binarySearch(nums,target,pos,0,len-1)){
62+
int left = pos;
63+
int right = pos;
64+
while(left>0 && nums[left-1] == nums[pos])left--;
65+
while(right<len-1 && nums[right+1] == nums[pos])right++;
66+
return {left,right};
67+
}
68+
else{
69+
return {-1,-1};
70+
}
71+
}
72+
};
73+
```
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Solution {
2+
public:
3+
bool binarySearch(vector<int> &nums,int &target,int &pos,int left,int right){
4+
int mid = left + ((right - left) >> 1);
5+
if(nums[left] == target){
6+
pos = left;
7+
return true;
8+
}
9+
if(nums[right] == target){
10+
pos = right;
11+
return true;
12+
}
13+
if(nums[mid] == target){
14+
pos = mid;
15+
return true;
16+
}
17+
18+
if(left == mid){
19+
return false;
20+
}
21+
else if(nums[mid] > target){
22+
return binarySearch(nums,target,pos,left,mid-1);
23+
}
24+
else if(nums[mid] < target){
25+
return binarySearch(nums,target,pos,mid+1,right);
26+
}
27+
28+
return false;
29+
}
30+
31+
vector<int> searchRange(vector<int>& nums, int target) {
32+
int pos = 0;
33+
int len = nums.size();
34+
if(len == 0)return {-1,-1};
35+
if(binarySearch(nums,target,pos,0,len-1)){
36+
int left = pos;
37+
int right = pos;
38+
while(left>0 && nums[left-1] == nums[pos])left--;
39+
while(right<len-1 && nums[right+1] == nums[pos])right++;
40+
return {left,right};
41+
}
42+
else{
43+
return {-1,-1};
44+
}
45+
}
46+
};

0 commit comments

Comments
 (0)