Skip to content

Commit f221274

Browse files
committed
feat: add solutions to lc problem: No.0034
No.0034.Find First and Last Position of Element in Sorted Array
1 parent 4f4f2b5 commit f221274

File tree

7 files changed

+253
-133
lines changed

7 files changed

+253
-133
lines changed

solution/0000-0099/0034.Find First and Last Position of Element in Sorted Array/README.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,14 @@ class Solution:
130130
return [l, left]
131131
```
132132

133+
```python
134+
class Solution:
135+
def searchRange(self, nums: List[int], target: int) -> List[int]:
136+
l = bisect_left(nums, target)
137+
r = bisect_left(nums, target + 1)
138+
return [-1, -1] if l == len(nums) or l >= r else [l, r - 1]
139+
```
140+
133141
### **Java**
134142

135143
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -170,6 +178,29 @@ class Solution {
170178
}
171179
```
172180

181+
```java
182+
class Solution {
183+
public int[] searchRange(int[] nums, int target) {
184+
int l = search(nums, target);
185+
int r = search(nums, target + 1);
186+
return l == nums.length || l >= r ? new int[]{-1, -1} : new int[]{l, r - 1};
187+
}
188+
189+
private int search(int[] nums, int target) {
190+
int left = 0, right = nums.length;
191+
while (left < right) {
192+
int mid = (left + right) >>> 1;
193+
if (nums[mid] >= target) {
194+
right = mid;
195+
} else {
196+
left = mid + 1;
197+
}
198+
}
199+
return left;
200+
}
201+
}
202+
```
203+
173204
### **C++**
174205

175206
```cpp
@@ -206,6 +237,18 @@ public:
206237
};
207238
```
208239
240+
```cpp
241+
class Solution {
242+
public:
243+
vector<int> searchRange(vector<int>& nums, int target) {
244+
int l = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
245+
int r = lower_bound(nums.begin(), nums.end(), target + 1) - nums.begin();
246+
if (l == nums.size() || l >= r) return {-1, -1};
247+
return {l, r - 1};
248+
}
249+
};
250+
```
251+
209252
### **JavaScript**
210253

211254
```js
@@ -245,6 +288,35 @@ var searchRange = function (nums, target) {
245288
};
246289
```
247290

291+
```js
292+
/**
293+
* @param {number[]} nums
294+
* @param {number} target
295+
* @return {number[]}
296+
*/
297+
var searchRange = function (nums, target) {
298+
function search(target) {
299+
let left = 0,
300+
right = nums.length;
301+
while (left < right) {
302+
const mid = (left + right) >> 1;
303+
if (nums[mid] >= target) {
304+
right = mid;
305+
} else {
306+
left = mid + 1;
307+
}
308+
}
309+
return left;
310+
}
311+
const l = search(target);
312+
const r = search(target + 1);
313+
if (l == nums.length || l >= r) {
314+
return [-1, -1];
315+
}
316+
return [l, r - 1];
317+
};
318+
```
319+
248320
### **Go**
249321

250322
```go
@@ -278,6 +350,28 @@ func searchRange(nums []int, target int) []int {
278350
}
279351
```
280352

353+
```go
354+
func searchRange(nums []int, target int) []int {
355+
search := func(target int) int {
356+
left, right := 0, len(nums)
357+
for left < right {
358+
mid := (left + right) >> 1
359+
if nums[mid] >= target {
360+
right = mid
361+
} else {
362+
left = mid + 1
363+
}
364+
}
365+
return left
366+
}
367+
l, r := search(target), search(target+1)
368+
if l == len(nums) || l >= r {
369+
return []int{-1, -1}
370+
}
371+
return []int{l, r - 1}
372+
}
373+
```
374+
281375
### **Rust**
282376

283377
```rust

solution/0000-0099/0034.Find First and Last Position of Element in Sorted Array/README_EN.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ class Solution:
9999
return [l, left]
100100
```
101101

102+
```python
103+
class Solution:
104+
def searchRange(self, nums: List[int], target: int) -> List[int]:
105+
l = bisect_left(nums, target)
106+
r = bisect_left(nums, target + 1)
107+
return [-1, -1] if l == len(nums) or l >= r else [l, r - 1]
108+
```
109+
102110
### **Java**
103111

104112
```java
@@ -137,6 +145,29 @@ class Solution {
137145
}
138146
```
139147

148+
```java
149+
class Solution {
150+
public int[] searchRange(int[] nums, int target) {
151+
int l = search(nums, target);
152+
int r = search(nums, target + 1);
153+
return l == nums.length || l >= r ? new int[]{-1, -1} : new int[]{l, r - 1};
154+
}
155+
156+
private int search(int[] nums, int target) {
157+
int left = 0, right = nums.length;
158+
while (left < right) {
159+
int mid = (left + right) >>> 1;
160+
if (nums[mid] >= target) {
161+
right = mid;
162+
} else {
163+
left = mid + 1;
164+
}
165+
}
166+
return left;
167+
}
168+
}
169+
```
170+
140171
### **C++**
141172

142173
```cpp
@@ -173,6 +204,18 @@ public:
173204
};
174205
```
175206
207+
```cpp
208+
class Solution {
209+
public:
210+
vector<int> searchRange(vector<int>& nums, int target) {
211+
int l = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
212+
int r = lower_bound(nums.begin(), nums.end(), target + 1) - nums.begin();
213+
if (l == nums.size() || l >= r) return {-1, -1};
214+
return {l, r - 1};
215+
}
216+
};
217+
```
218+
176219
### **JavaScript**
177220

178221
```js
@@ -212,6 +255,35 @@ var searchRange = function (nums, target) {
212255
};
213256
```
214257

258+
```js
259+
/**
260+
* @param {number[]} nums
261+
* @param {number} target
262+
* @return {number[]}
263+
*/
264+
var searchRange = function (nums, target) {
265+
function search(target) {
266+
let left = 0,
267+
right = nums.length;
268+
while (left < right) {
269+
const mid = (left + right) >> 1;
270+
if (nums[mid] >= target) {
271+
right = mid;
272+
} else {
273+
left = mid + 1;
274+
}
275+
}
276+
return left;
277+
}
278+
const l = search(target);
279+
const r = search(target + 1);
280+
if (l == nums.length || l >= r) {
281+
return [-1, -1];
282+
}
283+
return [l, r - 1];
284+
};
285+
```
286+
215287
### **Go**
216288

217289
```go
@@ -245,6 +317,28 @@ func searchRange(nums []int, target int) []int {
245317
}
246318
```
247319

320+
```go
321+
func searchRange(nums []int, target int) []int {
322+
search := func(target int) int {
323+
left, right := 0, len(nums)
324+
for left < right {
325+
mid := (left + right) >> 1
326+
if nums[mid] >= target {
327+
right = mid
328+
} else {
329+
left = mid + 1
330+
}
331+
}
332+
return left
333+
}
334+
l, r := search(target), search(target+1)
335+
if l == len(nums) || l >= r {
336+
return []int{-1, -1}
337+
}
338+
return []int{l, r - 1}
339+
}
340+
```
341+
248342
### **Rust**
249343

250344
```rust
Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,9 @@
1-
class Solution {
2-
public:
3-
vector<int> searchRange(vector<int>& nums, int target) {
4-
if (nums.size() == 0) {
5-
return vector<int>{-1, -1};
6-
}
7-
int left = 0, right = nums.size() - 1;
8-
while (left < right) {
9-
int mid = left + right >> 1;
10-
if (nums[mid] >= target) {
11-
right = mid;
12-
} else {
13-
left = mid + 1;
14-
}
15-
}
16-
if (nums[left] != target) {
17-
return vector<int>{-1, -1};
18-
}
19-
int l = left;
20-
right = nums.size() - 1;
21-
while (left < right) {
22-
int mid = left + right + 1 >> 1;
23-
if (nums[mid] <= target) {
24-
left = mid;
25-
} else {
26-
right = mid - 1;
27-
}
28-
}
29-
return vector<int>{l, left};
30-
}
1+
class Solution {
2+
public:
3+
vector<int> searchRange(vector<int>& nums, int target) {
4+
int l = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
5+
int r = lower_bound(nums.begin(), nums.end(), target + 1) - nums.begin();
6+
if (l == nums.size() || l >= r) return {-1, -1};
7+
return {l, r - 1};
8+
}
319
};
Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,19 @@
1-
func searchRange(nums []int, target int) []int {
2-
if len(nums) == 0 {
3-
return []int{-1, -1}
4-
}
5-
left, right := 0, len(nums)-1
6-
for left < right {
7-
mid := (left + right) >> 1
8-
if nums[mid] >= target {
9-
right = mid
10-
} else {
11-
left = mid + 1
12-
}
13-
}
14-
if nums[left] != target {
15-
return []int{-1, -1}
16-
}
17-
l := left
18-
right = len(nums) - 1
19-
for left < right {
20-
mid := (left + right + 1) >> 1
21-
if nums[mid] <= target {
22-
left = mid
23-
} else {
24-
right = mid - 1
25-
}
26-
}
27-
return []int{l, left}
1+
func searchRange(nums []int, target int) []int {
2+
search := func(target int) int {
3+
left, right := 0, len(nums)
4+
for left < right {
5+
mid := (left + right) >> 1
6+
if nums[mid] >= target {
7+
right = mid
8+
} else {
9+
left = mid + 1
10+
}
11+
}
12+
return left
13+
}
14+
l, r := search(target), search(target+1)
15+
if l == len(nums) || l >= r {
16+
return []int{-1, -1}
17+
}
18+
return []int{l, r - 1}
2819
}

0 commit comments

Comments
 (0)