0%

34. Find First and Last Position of Element in Sorted Array

34. Find First and Last Position of Element in Sorted Array

First Time
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int size = nums.size();
int lo = 0, hi = size - 1;
int pos = -1;
while(lo <= hi)
{
int medium = (hi + lo) / 2;
if(nums[medium] < target)
{
lo = medium + 1;
}else if(nums[medium] > target)
{
hi = medium - 1;
}else
{
pos = medium;
while (pos > 0 && nums[pos] == nums[pos - 1]) --pos;
break;
}
}
if(pos == -1) return {-1, -1};
int i = pos + 1;
while(i < size)
{
if(nums[i] != target)
break;
else
++i;
}
return {pos, i - 1};
}
};
Second time
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int size = nums.size();
int lo = 0, hi = size - 1;
int posL = -1, posR = -1;
while(lo <= hi)
{
int medium = (hi + lo) / 2;
if(nums[medium] < target)
{
lo = medium + 1;
}else if(nums[medium] > target)
{
hi = medium - 1;
}else
{
posL = posR = medium;
while (posL > 0 && nums[posL] == nums[posL - 1]) --posL;
while (posR < size - 1 && nums[posR] == nums[posR + 1]) ++posR;
break;
}
}
return {posL, posR};
}
};
Solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left = binarySearch(nums, target, true);
if(left == nums.size() || nums[left] != target)
return {-1, -1};
return {left, binarySearch(nums, target, false) - 1};
}
private:
int binarySearch(vector<int>& nums, int target, bool isLeft)
{
int lo = 0, hi = nums.size();
while(lo < hi)
{
int med = (lo + hi) / 2;
if(nums[med] > target || (isLeft && nums[med] == target))
{
hi = med;
}else
{
lo = med + 1;
}
}
return lo;
}
};
review
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.empty())
return {-1, -1};
int lo = 0, hi = nums.size() - 1;
while(lo < hi)
{
int mid = (lo + hi) / 2;
if(nums[mid] < target)
lo = mid + 1;
else
hi = mid;
}
if(nums[lo] != target)
return {-1, -1};
int left = lo;
lo = 0;
hi = nums.size() - 1;
while(lo < hi)
{
int mid = (lo + hi) / 2 + 1;
if(nums[mid] <= target)
lo = mid;
else
hi = mid - 1;
}
return {left, hi};

}
};

其中第一次往左找,第二次的mid+1是为了使mid偏向右边,从而找到最右的