Skip to content

Commit fb27c0f

Browse files
author
lucifer
committed
feat: binary-search template
1 parent 74fd528 commit fb27c0f

File tree

1 file changed

+99
-26
lines changed

1 file changed

+99
-26
lines changed

‎src/codeTemplates/binarySearch.js

+99-26
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,28 @@ export default {
6969
return -1;
7070
}`,
7171
},
72+
{
73+
language: "cpp",
74+
text: `
75+
int binarySearch(vector<int>& nums, int target){
76+
if(nums.size() == 0)
77+
return -1;
78+
79+
int left = 0, right = nums.size() - 1;
80+
while(left <= right){
81+
int mid = left + ((right - left) >> 1);
82+
if(nums[mid] == target){ return mid; }
83+
// 搜索区间变为 [mid+1, right]
84+
else if(nums[mid] < target)
85+
left = mid + 1;
86+
// 搜索区间变为 [left, mid - 1]
87+
else
88+
right = mid - 1;
89+
}
90+
return -1;
91+
}
92+
`,
93+
},
7294
],
7395
},
7496
{
@@ -143,6 +165,34 @@ export default {
143165
return left;
144166
}`,
145167
},
168+
{
169+
language: "cpp",
170+
text: `
171+
int binarySearchLeft(vector<int>& nums, int target) {
172+
// 搜索区间为 [left, right]
173+
int left = 0, right = nums.size() - 1;
174+
while (left <= right) {
175+
int mid = left + ((right - left) >> 1);
176+
if (nums[mid] == target) {
177+
// 收缩右边界
178+
right = mid - 1;
179+
}
180+
if (nums[mid] < target) {
181+
// 搜索区间变为 [mid+1, right]
182+
left = mid + 1;
183+
}
184+
if (nums[mid] > target) {
185+
// 搜索区间变为 [left, mid-1]
186+
right = mid - 1;
187+
}
188+
}
189+
// 检查是否越界
190+
if (left >= nums.size() || nums[left] != target)
191+
return -1;
192+
return left;
193+
}
194+
`,
195+
},
146196
],
147197
},
148198
{
@@ -217,6 +267,35 @@ export default {
217267
return right;
218268
}`,
219269
},
270+
{
271+
language: "cpp",
272+
text: `
273+
int binarySearchRight(vector<int>& nums, int target) {
274+
// 搜索区间为 [left, right]
275+
int left = 0, right = nums.size() - 1;
276+
while (left <= right) {
277+
int mid = left + ((right - left) >> 1);
278+
if (nums[mid] == target) {
279+
// 收缩左边界
280+
left = mid + 1;
281+
}
282+
if (nums[mid] < target) {
283+
// 搜索区间变为 [mid+1, right]
284+
left = mid + 1;
285+
}
286+
if (nums[mid] > target) {
287+
// 搜索区间变为 [left, mid-1]
288+
right = mid - 1;
289+
}
290+
}
291+
// 检查是否越界
292+
if (right < 0 || nums[right] != target)
293+
return -1;
294+
return right;
295+
}
296+
297+
`,
298+
},
220299
],
221300
},
222301
{
@@ -225,19 +304,16 @@ export default {
225304
{
226305
language: "py",
227306
text: `
228-
def bisect_left(nums, x):
229-
# 内置 api
230-
bisect.bisect_left(nums, x)
231-
# 手写
232-
l, r = 0, len(nums) - 1
233-
while l < r:
234-
mid = (l + r) // 2
235-
if nums[mid] < x:
236-
l = mid + 1
237-
else:
238-
r = mid
239-
# 由于 l 和 r 相等,因此返回谁都无所谓。
240-
return l
307+
def bisect_left(nums, x):
308+
# 内置 api
309+
bisect.bisect_left(nums, x)
310+
# 手写
311+
l, r = 0, len(A) - 1
312+
while l <= r:
313+
mid = (l + r) // 2
314+
if A[mid] >= x: r = mid - 1
315+
else: l = mid + 1
316+
return l
241317
`,
242318
},
243319
{
@@ -280,19 +356,16 @@ function searchInsertLeft(nums, x) {
280356
{
281357
language: "py",
282358
text: `
283-
def bisect_right(nums, x):
284-
# 内置 api
285-
bisect.bisect_right(nums, x)
286-
# 手写
287-
l, r = 0, len(nums) - 1
288-
while l < r:
289-
mid = (l + r) // 2
290-
if nums[mid] > x:
291-
r = mid
292-
else:
293-
l = mid + 1
294-
# 由于 l 和 r 相等,因此返回谁都无所谓。
295-
return l
359+
def bisect_right(nums, x):
360+
# 内置 api
361+
bisect.bisect_right(nums, x)
362+
# 手写
363+
l, r = 0, len(A) - 1
364+
while l <= r:
365+
mid = (l + r) // 2
366+
if A[mid] <= x: l = mid + 1
367+
else: r = mid - 1
368+
return l
296369
`,
297370
},
298371
{

0 commit comments

Comments
 (0)