Skip to content

Commit 6ae477f

Browse files
committed
feat: update solutions to lc problem: No.0034
No.0034.Find First and Last Position of Element in Sorted Array
1 parent 5d84310 commit 6ae477f

File tree

8 files changed

+130
-227
lines changed

8 files changed

+130
-227
lines changed

README.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
- [准时到达的列车最小时速](/solution/1800-1899/1870.Minimum%20Speed%20to%20Arrive%20on%20Time/README.md) - 二分查找
3939
- [找到需要补充粉笔的学生编号](/solution/1800-1899/1894.Find%20the%20Student%20that%20Will%20Replace%20the%20Chalk/README.md) - 二分查找
4040
- [可移除字符的最大数目](/solution/1800-1899/1898.Maximum%20Number%20of%20Removable%20Characters/README.md) - 二分查找
41+
<!-- 排序算法、待补充 -->
4142

4243
### 2. 搜索
4344

@@ -59,6 +60,7 @@
5960
- [迷宫](/solution/0400-0499/0490.The%20Maze/README.md) - DFS、连通性模型、Flood Fill 算法
6061
- [单词搜索](/solution/0000-0099/0079.Word%20Search/README.md) - DFS、搜索顺序、回溯
6162
- [黄金矿工](/solution/1200-1299/1219.Path%20with%20Maximum%20Gold/README.md) - DFS、搜索顺序、回溯
63+
<!-- DFS 待补充 -->
6264

6365
### 3. 动态规划(DP)
6466

@@ -71,6 +73,7 @@
7173
- [删列造序 III](/solution/0900-0999/0960.Delete%20Columns%20to%20Make%20Sorted%20III/README.md) - 线性 DP、最长上升子序列模型
7274
- [俄罗斯套娃信封问题](/solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md) - 线性 DP、最长上升子序列模型、贪心优化
7375
- [堆叠长方体的最大高度](/solution/1600-1699/1691.Maximum%20Height%20by%20Stacking%20Cuboids/README.md) - 排序、线性 DP、最长上升子序列模型
76+
<!-- 背包问题、状态机模型、状压DP、区间DP、树形DP、数位DP 待补充 -->
7477

7578
### 4. 高级数据结构
7679

@@ -99,7 +102,7 @@
99102
- [由单个字符重复的最长子字符串](/solution/2200-2299/2213.Longest%20Substring%20of%20One%20Repeating%20Character/README.md) - 线段树、动态最大子段和模型
100103
- [矩形面积 II](/solution/0800-0899/0850.Rectangle%20Area%20II/README.md) - 线段树、离散化、扫描线
101104

102-
<!--
105+
<!-- 待补充
103106
### 5. 图论
104107
105108
### 6. 数学知识

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

+29-109
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54-
二分查找。两遍二分,分别查找出左边界和右边界。
54+
**方法一:二分查找**
55+
56+
两遍二分,分别查找出左边界和右边界。
57+
58+
以下是二分查找的两个通用模板:
5559

5660
模板 1:
5761

@@ -118,42 +122,6 @@ class Solution:
118122

119123
<!-- 这里可写当前语言的特殊实现逻辑 -->
120124

121-
```java
122-
class Solution {
123-
public int[] searchRange(int[] nums, int target) {
124-
if (nums.length == 0) {
125-
return new int[]{-1, -1};
126-
}
127-
// find first position
128-
int left = 0, right = nums.length - 1;
129-
while (left < right) {
130-
int mid = (left + right) >>> 1;
131-
if (nums[mid] >= target) {
132-
right = mid;
133-
} else {
134-
left = mid + 1;
135-
}
136-
}
137-
if (nums[left] != target) {
138-
return new int[]{-1, -1};
139-
}
140-
int l = left;
141-
142-
// find last position
143-
right = nums.length - 1;
144-
while (left < right) {
145-
int mid = (left + right + 1) >>> 1;
146-
if (nums[mid] <= target) {
147-
left = mid;
148-
} else {
149-
right = mid - 1;
150-
}
151-
}
152-
return new int[]{l, left};
153-
}
154-
}
155-
```
156-
157125
```java
158126
class Solution {
159127
public int[] searchRange(int[] nums, int target) {
@@ -193,43 +161,6 @@ public:
193161
194162
### **JavaScript**
195163
196-
```js
197-
/**
198-
* @param {number[]} nums
199-
* @param {number} target
200-
* @return {number[]}
201-
*/
202-
var searchRange = function (nums, target) {
203-
if (nums.length == 0) {
204-
return [-1, -1];
205-
}
206-
let left = 0;
207-
let right = nums.length - 1;
208-
while (left < right) {
209-
const mid = (left + right) >> 1;
210-
if (nums[mid] >= target) {
211-
right = mid;
212-
} else {
213-
left = mid + 1;
214-
}
215-
}
216-
if (nums[left] != target) {
217-
return [-1, -1];
218-
}
219-
let l = left;
220-
right = nums.length - 1;
221-
while (left < right) {
222-
const mid = (left + right + 1) >> 1;
223-
if (nums[mid] <= target) {
224-
left = mid;
225-
} else {
226-
right = mid - 1;
227-
}
228-
}
229-
return [l, left];
230-
};
231-
```
232-
233164
```js
234165
/**
235166
* @param {number[]} nums
@@ -252,46 +183,12 @@ var searchRange = function (nums, target) {
252183
}
253184
const l = search(target);
254185
const r = search(target + 1);
255-
if (l == nums.length || l >= r) {
256-
return [-1, -1];
257-
}
258-
return [l, r - 1];
186+
return l == nums.length || l >= r ? [-1, -1] : [l, r - 1];
259187
};
260188
```
261189

262190
### **Go**
263191

264-
```go
265-
func searchRange(nums []int, target int) []int {
266-
if len(nums) == 0 {
267-
return []int{-1, -1}
268-
}
269-
left, right := 0, len(nums)-1
270-
for left < right {
271-
mid := (left + right) >> 1
272-
if nums[mid] >= target {
273-
right = mid
274-
} else {
275-
left = mid + 1
276-
}
277-
}
278-
if nums[left] != target {
279-
return []int{-1, -1}
280-
}
281-
l := left
282-
right = len(nums) - 1
283-
for left < right {
284-
mid := (left + right + 1) >> 1
285-
if nums[mid] <= target {
286-
left = mid
287-
} else {
288-
right = mid - 1
289-
}
290-
}
291-
return []int{l, left}
292-
}
293-
```
294-
295192
```go
296193
func searchRange(nums []int, target int) []int {
297194
search := func(target int) int {
@@ -364,6 +261,29 @@ impl Solution {
364261
}
365262
```
366263

264+
### **TypeScript**
265+
266+
```ts
267+
function searchRange(nums: number[], target: number): number[] {
268+
function search(target) {
269+
let left = 0,
270+
right = nums.length;
271+
while (left < right) {
272+
const mid = (left + right) >> 1;
273+
if (nums[mid] >= target) {
274+
right = mid;
275+
} else {
276+
left = mid + 1;
277+
}
278+
}
279+
return left;
280+
}
281+
const l = search(target);
282+
const r = search(target + 1);
283+
return l == nums.length || l >= r ? [-1, -1] : [l, r - 1];
284+
}
285+
```
286+
367287
### **...**
368288

369289
```

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

+24-108
Original file line numberDiff line numberDiff line change
@@ -85,42 +85,6 @@ class Solution:
8585

8686
### **Java**
8787

88-
```java
89-
class Solution {
90-
public int[] searchRange(int[] nums, int target) {
91-
if (nums.length == 0) {
92-
return new int[]{-1, -1};
93-
}
94-
// find first position
95-
int left = 0, right = nums.length - 1;
96-
while (left < right) {
97-
int mid = (left + right) >>> 1;
98-
if (nums[mid] >= target) {
99-
right = mid;
100-
} else {
101-
left = mid + 1;
102-
}
103-
}
104-
if (nums[left] != target) {
105-
return new int[]{-1, -1};
106-
}
107-
int l = left;
108-
109-
// find last position
110-
right = nums.length - 1;
111-
while (left < right) {
112-
int mid = (left + right + 1) >>> 1;
113-
if (nums[mid] <= target) {
114-
left = mid;
115-
} else {
116-
right = mid - 1;
117-
}
118-
}
119-
return new int[]{l, left};
120-
}
121-
}
122-
```
123-
12488
```java
12589
class Solution {
12690
public int[] searchRange(int[] nums, int target) {
@@ -160,43 +124,6 @@ public:
160124
161125
### **JavaScript**
162126
163-
```js
164-
/**
165-
* @param {number[]} nums
166-
* @param {number} target
167-
* @return {number[]}
168-
*/
169-
var searchRange = function (nums, target) {
170-
if (nums.length == 0) {
171-
return [-1, -1];
172-
}
173-
let left = 0;
174-
let right = nums.length - 1;
175-
while (left < right) {
176-
const mid = (left + right) >> 1;
177-
if (nums[mid] >= target) {
178-
right = mid;
179-
} else {
180-
left = mid + 1;
181-
}
182-
}
183-
if (nums[left] != target) {
184-
return [-1, -1];
185-
}
186-
let l = left;
187-
right = nums.length - 1;
188-
while (left < right) {
189-
const mid = (left + right + 1) >> 1;
190-
if (nums[mid] <= target) {
191-
left = mid;
192-
} else {
193-
right = mid - 1;
194-
}
195-
}
196-
return [l, left];
197-
};
198-
```
199-
200127
```js
201128
/**
202129
* @param {number[]} nums
@@ -219,46 +146,12 @@ var searchRange = function (nums, target) {
219146
}
220147
const l = search(target);
221148
const r = search(target + 1);
222-
if (l == nums.length || l >= r) {
223-
return [-1, -1];
224-
}
225-
return [l, r - 1];
149+
return l == nums.length || l >= r ? [-1, -1] : [l, r - 1];
226150
};
227151
```
228152

229153
### **Go**
230154

231-
```go
232-
func searchRange(nums []int, target int) []int {
233-
if len(nums) == 0 {
234-
return []int{-1, -1}
235-
}
236-
left, right := 0, len(nums)-1
237-
for left < right {
238-
mid := (left + right) >> 1
239-
if nums[mid] >= target {
240-
right = mid
241-
} else {
242-
left = mid + 1
243-
}
244-
}
245-
if nums[left] != target {
246-
return []int{-1, -1}
247-
}
248-
l := left
249-
right = len(nums) - 1
250-
for left < right {
251-
mid := (left + right + 1) >> 1
252-
if nums[mid] <= target {
253-
left = mid
254-
} else {
255-
right = mid - 1
256-
}
257-
}
258-
return []int{l, left}
259-
}
260-
```
261-
262155
```go
263156
func searchRange(nums []int, target int) []int {
264157
search := func(target int) int {
@@ -331,6 +224,29 @@ impl Solution {
331224
}
332225
```
333226

227+
### **TypeScript**
228+
229+
```ts
230+
function searchRange(nums: number[], target: number): number[] {
231+
function search(target) {
232+
let left = 0,
233+
right = nums.length;
234+
while (left < right) {
235+
const mid = (left + right) >> 1;
236+
if (nums[mid] >= target) {
237+
right = mid;
238+
} else {
239+
left = mid + 1;
240+
}
241+
}
242+
return left;
243+
}
244+
const l = search(target);
245+
const r = search(target + 1);
246+
return l == nums.length || l >= r ? [-1, -1] : [l, r - 1];
247+
}
248+
```
249+
334250
### **...**
335251

336252
```

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,5 @@ var searchRange = function (nums, target) {
1919
}
2020
const l = search(target);
2121
const r = search(target + 1);
22-
if (l == nums.length || l >= r) {
23-
return [-1, -1];
24-
}
25-
return [l, r - 1];
22+
return l == nums.length || l >= r ? [-1, -1] : [l, r - 1];
2623
};

0 commit comments

Comments
 (0)