Skip to content

Commit 7f77f4c

Browse files
committed
perf: update solutions to lc problem: No.0034
* No.0034.Find First and Last Position of Element in Sorted Array * close doocs#844
1 parent 7340a73 commit 7f77f4c

File tree

9 files changed

+90
-138
lines changed

9 files changed

+90
-138
lines changed

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

Lines changed: 36 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151

5252
两遍二分,分别查找出左边界和右边界。
5353

54+
时间复杂度 $O(\log n)$。其中 $n$ 为数组长度。
55+
5456
以下是二分查找的两个通用模板:
5557

5658
模板 1:
@@ -111,7 +113,7 @@ class Solution:
111113
def searchRange(self, nums: List[int], target: int) -> List[int]:
112114
l = bisect_left(nums, target)
113115
r = bisect_left(nums, target + 1)
114-
return [-1, -1] if l == len(nums) or l >= r else [l, r - 1]
116+
return [-1, -1] if l == r else [l, r - 1]
115117
```
116118

117119
### **Java**
@@ -123,14 +125,14 @@ class Solution {
123125
public int[] searchRange(int[] nums, int target) {
124126
int l = search(nums, target);
125127
int r = search(nums, target + 1);
126-
return l == nums.length || l >= r ? new int[] {-1, -1} : new int[] {l, r - 1};
128+
return l == r ? new int[] {-1, -1} : new int[] {l, r - 1};
127129
}
128130

129-
private int search(int[] nums, int target) {
131+
private int search(int[] nums, int x) {
130132
int left = 0, right = nums.length;
131133
while (left < right) {
132134
int mid = (left + right) >>> 1;
133-
if (nums[mid] >= target) {
135+
if (nums[mid] >= x) {
134136
right = mid;
135137
} else {
136138
left = mid + 1;
@@ -149,7 +151,7 @@ public:
149151
vector<int> searchRange(vector<int>& nums, int target) {
150152
int l = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
151153
int r = lower_bound(nums.begin(), nums.end(), target + 1) - nums.begin();
152-
if (l == nums.size() || l >= r) return {-1, -1};
154+
if (l == r) return {-1, -1};
153155
return {l, r - 1};
154156
}
155157
};
@@ -164,12 +166,12 @@ public:
164166
* @return {number[]}
165167
*/
166168
var searchRange = function (nums, target) {
167-
function search(target) {
169+
function search(x) {
168170
let left = 0,
169171
right = nums.length;
170172
while (left < right) {
171173
const mid = (left + right) >> 1;
172-
if (nums[mid] >= target) {
174+
if (nums[mid] >= x) {
173175
right = mid;
174176
} else {
175177
left = mid + 1;
@@ -179,31 +181,31 @@ var searchRange = function (nums, target) {
179181
}
180182
const l = search(target);
181183
const r = search(target + 1);
182-
return l == nums.length || l >= r ? [-1, -1] : [l, r - 1];
184+
return l == r ? [-1, -1] : [l, r - 1];
183185
};
184186
```
185187

186188
### **Go**
187189

188190
```go
189191
func searchRange(nums []int, target int) []int {
190-
search := func(target int) int {
191-
left, right := 0, len(nums)
192-
for left < right {
193-
mid := (left + right) >> 1
194-
if nums[mid] >= target {
195-
right = mid
196-
} else {
197-
left = mid + 1
198-
}
199-
}
200-
return left
201-
}
202-
l, r := search(target), search(target+1)
203-
if l == len(nums) || l >= r {
204-
return []int{-1, -1}
205-
}
206-
return []int{l, r - 1}
192+
search := func(x int) int {
193+
left, right := 0, len(nums)
194+
for left < right {
195+
mid := (left + right) >> 1
196+
if nums[mid] >= x {
197+
right = mid
198+
} else {
199+
left = mid + 1
200+
}
201+
}
202+
return left
203+
}
204+
l, r := search(target), search(target+1)
205+
if l == r {
206+
return []int{-1, -1}
207+
}
208+
return []int{l, r - 1}
207209
}
208210
```
209211

@@ -213,25 +215,25 @@ func searchRange(nums []int, target int) []int {
213215
impl Solution {
214216
pub fn search_range(nums: Vec<i32>, target: i32) -> Vec<i32> {
215217
let n = nums.len();
216-
let search = |target| {
218+
let search = |x| {
217219
let mut left = 0;
218220
let mut right = n;
219221
while left < right {
220222
let mid = left + (right - left) / 2;
221-
if nums[mid] < target {
223+
if nums[mid] < x {
222224
left = mid + 1;
223225
} else {
224226
right = mid;
225227
}
226228
}
227229
left
228230
};
229-
let start = search(target);
230-
let end = search(target + 1) - 1;
231-
if start >= n || nums[start] != target {
231+
let l = search(target);
232+
let r = search(target + 1);
233+
if l == r {
232234
return vec![-1, -1];
233235
}
234-
vec![start as i32, end as i32]
236+
vec![l as i32, (r - 1) as i32]
235237
}
236238
}
237239
```
@@ -240,12 +242,12 @@ impl Solution {
240242

241243
```ts
242244
function searchRange(nums: number[], target: number): number[] {
243-
function search(target) {
245+
function search(x) {
244246
let left = 0,
245247
right = nums.length;
246248
while (left < right) {
247249
const mid = (left + right) >> 1;
248-
if (nums[mid] >= target) {
250+
if (nums[mid] >= x) {
249251
right = mid;
250252
} else {
251253
left = mid + 1;
@@ -255,32 +257,7 @@ function searchRange(nums: number[], target: number): number[] {
255257
}
256258
const l = search(target);
257259
const r = search(target + 1);
258-
return l == nums.length || l >= r ? [-1, -1] : [l, r - 1];
259-
}
260-
```
261-
262-
```ts
263-
function searchRange(nums: number[], target: number): number[] {
264-
const n = nums.length;
265-
const search = (target: number) => {
266-
let left = 0;
267-
let right = n;
268-
while (left < right) {
269-
const mid = (left + right) >>> 1;
270-
if (nums[mid] < target) {
271-
left = mid + 1;
272-
} else {
273-
right = mid;
274-
}
275-
}
276-
return left;
277-
};
278-
const start = search(target);
279-
const end = search(target + 1) - 1;
280-
if (nums[start] !== target) {
281-
return [-1, -1];
282-
}
283-
return [start, end];
260+
return l == r ? [-1, -1] : [l, r - 1];
284261
}
285262
```
286263

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

Lines changed: 34 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class Solution:
8080
def searchRange(self, nums: List[int], target: int) -> List[int]:
8181
l = bisect_left(nums, target)
8282
r = bisect_left(nums, target + 1)
83-
return [-1, -1] if l == len(nums) or l >= r else [l, r - 1]
83+
return [-1, -1] if l == r else [l, r - 1]
8484
```
8585

8686
### **Java**
@@ -90,14 +90,14 @@ class Solution {
9090
public int[] searchRange(int[] nums, int target) {
9191
int l = search(nums, target);
9292
int r = search(nums, target + 1);
93-
return l == nums.length || l >= r ? new int[] {-1, -1} : new int[] {l, r - 1};
93+
return l == r ? new int[] {-1, -1} : new int[] {l, r - 1};
9494
}
9595

96-
private int search(int[] nums, int target) {
96+
private int search(int[] nums, int x) {
9797
int left = 0, right = nums.length;
9898
while (left < right) {
9999
int mid = (left + right) >>> 1;
100-
if (nums[mid] >= target) {
100+
if (nums[mid] >= x) {
101101
right = mid;
102102
} else {
103103
left = mid + 1;
@@ -116,7 +116,7 @@ public:
116116
vector<int> searchRange(vector<int>& nums, int target) {
117117
int l = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
118118
int r = lower_bound(nums.begin(), nums.end(), target + 1) - nums.begin();
119-
if (l == nums.size() || l >= r) return {-1, -1};
119+
if (l == r) return {-1, -1};
120120
return {l, r - 1};
121121
}
122122
};
@@ -131,12 +131,12 @@ public:
131131
* @return {number[]}
132132
*/
133133
var searchRange = function (nums, target) {
134-
function search(target) {
134+
function search(x) {
135135
let left = 0,
136136
right = nums.length;
137137
while (left < right) {
138138
const mid = (left + right) >> 1;
139-
if (nums[mid] >= target) {
139+
if (nums[mid] >= x) {
140140
right = mid;
141141
} else {
142142
left = mid + 1;
@@ -146,31 +146,31 @@ var searchRange = function (nums, target) {
146146
}
147147
const l = search(target);
148148
const r = search(target + 1);
149-
return l == nums.length || l >= r ? [-1, -1] : [l, r - 1];
149+
return l == r ? [-1, -1] : [l, r - 1];
150150
};
151151
```
152152

153153
### **Go**
154154

155155
```go
156156
func searchRange(nums []int, target int) []int {
157-
search := func(target int) int {
158-
left, right := 0, len(nums)
159-
for left < right {
160-
mid := (left + right) >> 1
161-
if nums[mid] >= target {
162-
right = mid
163-
} else {
164-
left = mid + 1
165-
}
166-
}
167-
return left
168-
}
169-
l, r := search(target), search(target+1)
170-
if l == len(nums) || l >= r {
171-
return []int{-1, -1}
172-
}
173-
return []int{l, r - 1}
157+
search := func(x int) int {
158+
left, right := 0, len(nums)
159+
for left < right {
160+
mid := (left + right) >> 1
161+
if nums[mid] >= x {
162+
right = mid
163+
} else {
164+
left = mid + 1
165+
}
166+
}
167+
return left
168+
}
169+
l, r := search(target), search(target+1)
170+
if l == r {
171+
return []int{-1, -1}
172+
}
173+
return []int{l, r - 1}
174174
}
175175
```
176176

@@ -180,25 +180,25 @@ func searchRange(nums []int, target int) []int {
180180
impl Solution {
181181
pub fn search_range(nums: Vec<i32>, target: i32) -> Vec<i32> {
182182
let n = nums.len();
183-
let search = |target| {
183+
let search = |x| {
184184
let mut left = 0;
185185
let mut right = n;
186186
while left < right {
187187
let mid = left + (right - left) / 2;
188-
if nums[mid] < target {
188+
if nums[mid] < x {
189189
left = mid + 1;
190190
} else {
191191
right = mid;
192192
}
193193
}
194194
left
195195
};
196-
let start = search(target);
197-
let end = search(target + 1) - 1;
198-
if start >= n || nums[start] != target {
196+
let l = search(target);
197+
let r = search(target + 1);
198+
if l == r {
199199
return vec![-1, -1];
200200
}
201-
vec![start as i32, end as i32]
201+
vec![l as i32, (r - 1) as i32]
202202
}
203203
}
204204
```
@@ -207,12 +207,12 @@ impl Solution {
207207

208208
```ts
209209
function searchRange(nums: number[], target: number): number[] {
210-
function search(target) {
210+
function search(x) {
211211
let left = 0,
212212
right = nums.length;
213213
while (left < right) {
214214
const mid = (left + right) >> 1;
215-
if (nums[mid] >= target) {
215+
if (nums[mid] >= x) {
216216
right = mid;
217217
} else {
218218
left = mid + 1;
@@ -222,32 +222,7 @@ function searchRange(nums: number[], target: number): number[] {
222222
}
223223
const l = search(target);
224224
const r = search(target + 1);
225-
return l == nums.length || l >= r ? [-1, -1] : [l, r - 1];
226-
}
227-
```
228-
229-
```ts
230-
function searchRange(nums: number[], target: number): number[] {
231-
const n = nums.length;
232-
const search = (target: number) => {
233-
let left = 0;
234-
let right = n;
235-
while (left < right) {
236-
const mid = (left + right) >>> 1;
237-
if (nums[mid] < target) {
238-
left = mid + 1;
239-
} else {
240-
right = mid;
241-
}
242-
}
243-
return left;
244-
};
245-
const start = search(target);
246-
const end = search(target + 1) - 1;
247-
if (nums[start] !== target) {
248-
return [-1, -1];
249-
}
250-
return [start, end];
225+
return l == r ? [-1, -1] : [l, r - 1];
251226
}
252227
```
253228

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ class Solution {
33
vector<int> searchRange(vector<int>& nums, int target) {
44
int l = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
55
int r = lower_bound(nums.begin(), nums.end(), target + 1) - nums.begin();
6-
if (l == nums.size() || l >= r) return {-1, -1};
6+
if (l == r) return {-1, -1};
77
return {l, r - 1};
88
}
99
};

0 commit comments

Comments
 (0)