-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path034_SearchForARange.cpp
131 lines (124 loc) · 3.2 KB
/
034_SearchForARange.cpp
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//1.88%
//My first method
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int size(nums.size());
vector<int> res(2);
int left(0), right(size - 1);
int mid(-1);
while(left <= right){
mid = (left + right) / 2;
if(nums[mid] > target)
right = mid - 1;
else if(nums[mid] < target)
left = mid + 1;
else
break;
}
if(left > right){
res[0] = -1;
res[1] = -1;
return res;
}
left = mid; right = mid;
while(left > 0 && nums[left - 1] == target) left--;
while(right < size - 1 && nums[right + 1] == target) right++;
res[0] = left;
res[1] = right;
return res;
}
};
//43.77%
//My second method
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int size(nums.size());
vector<int> res(2, -1);
if(nums.empty()) return res;
//Find out low bound
int low(-1), up(-1);
if(nums[0] == target)
low = 0;
else if(nums[0] > target)
return res;
else{
int left(0), right(size - 1);
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] > target)
right = mid - 1;
else if(nums[mid] < target)
left = mid + 1;
else if(nums[mid - 1] < target){
low = mid;
break;
}else
right = mid - 1;
}
}
//Find up bound
if(nums[size - 1] == target)
up = size - 1;
else if(nums[size - 1] < target)
return res;
else{
int left = 0;
int right = size - 1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] > target)
right = mid - 1;
else if(nums[mid] < target)
left = mid + 1;
else if(nums[mid + 1] > target){
up = mid;
break;
}else
left = mid + 1;
}
}
res[0] = low;
res[1] = up;
return res;
}
};
//A better solution than mine and told us how to obtain the bound value in a sorted sequence
vector<int> searchRange(int A[], int n, int target) {
int i = 0, j = n - 1;
vector<int> ret(2, -1);
// Search for the left one
while (i < j)
{
int mid = (i + j) /2;
if (A[mid] < target) i = mid + 1;
else j = mid;
}
if (A[i]!=target) return ret;
else ret[0] = i;
// Search for the right one
j = n-1; // We don't have to set i to 0 the second time.
while (i < j)
{
int mid = (i + j) /2 + 1; // Make mid biased to the right
if (A[mid] > target) j = mid - 1;
else i = mid; // So that this won't make the search range stuck.
}
ret[1] = j;
return ret;
}
//By using std library
vector<int> searchRange(vector<int>& nums, int target) {
auto bounds = equal_range(nums.begin(), nums.end(), target);
if (bounds.first == bounds.second)
return {-1, -1};
return {bounds.first - nums.begin(), bounds.second - nums.begin() - 1};
}
vector<int> searchRange(vector<int>& nums, int target) {
int lo = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
if (lo == nums.size() || nums[lo] != target)
return {-1, -1};
int hi = upper_bound(nums.begin(), nums.end(), target) - nums.begin() - 1;
return {lo, hi};
}