Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 81dc774

Browse files
[新增] 新增题目 704. 二分查找
1 parent d33b6da commit 81dc774

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed

‎src/704_binarySearch.ts‎

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import testCases from '../tests/testCases/704_binarySearch'
2+
3+
/*
4+
704. 二分查找
5+
https://leetcode.cn/problems/binary-search/
6+
难度:简单
7+
8+
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
9+
10+
示例 1:
11+
输入: nums = [-1,0,3,5,9,12], target = 9
12+
输出: 4
13+
解释: 9 出现在 nums 中并且下标为 4
14+
15+
示例 2:
16+
输入: nums = [-1,0,3,5,9,12], target = 2
17+
输出: -1
18+
解释: 2 不存在 nums 中因此返回 -1
19+
20+
提示:
21+
你可以假设 nums 中的所有元素是不重复的。
22+
n 将在 [1, 10000]之间。
23+
nums 的每个元素都将在 [-9999, 9999]之间。
24+
*/
25+
26+
/**
27+
* 二分查找元素下标
28+
* - LeetCode 入口
29+
* @param nums - 待查找的整型数组,要求为升序且没有重复元素
30+
* @param target - 待查找的数字
31+
* @returns {number} 元素下标
32+
*/
33+
function search (nums: number[], target: number): number {
34+
// 使用左右指针,每次查找 [left, right) 最中间的值
35+
let left = 0
36+
let right = nums.length
37+
38+
while (left < right) {
39+
// 使用位运算获取左右中间的下标,位运算 >> 1 等同于 Math.floor()
40+
const middle = left + ((right - left) >> 1)
41+
// 要查找的目标为当前正中间的元素,返回正中间的下标
42+
if (target === nums[middle]) return middle
43+
// 要查找的目标大于当前正中间的元素,将查找区间更新为右区间
44+
if (target > nums[middle]) left = middle + 1
45+
// 要查找的目标小于当前正中间的元素,将查找区间更新为左区间
46+
if (target < nums[middle]) right = middle
47+
}
48+
49+
// 没有查找到对应的元素
50+
return -1
51+
}
52+
53+
// Debug
54+
if (require.main === module) {
55+
const { input, expected } = testCases[6]
56+
const output = search(input.nums, input.target)
57+
console.log({ input, output, expected })
58+
}
59+
60+
export { search }

‎tests/704_binarySearch.test.ts‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { describe, test, expect } from '@jest/globals'
2+
import testCases from './testCases/704_binarySearch'
3+
import { search } from '../src/704_binarySearch'
4+
5+
describe('704. Binary Search', () => {
6+
testCases.forEach(({ input, expected }, index) => {
7+
test(`Test case index: ${index}`, () => {
8+
expect(search(input.nums, input.target)).toBe(expected)
9+
})
10+
})
11+
})

‎tests/testCases/704_binarySearch.ts‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
export default [
2+
{
3+
input: {
4+
nums: [-1, 0, 3, 5, 9, 12],
5+
target: -1
6+
},
7+
expected: 0
8+
},
9+
{
10+
input: {
11+
nums: [-1, 0, 3, 5, 9, 12],
12+
target: 0
13+
},
14+
expected: 1
15+
},
16+
{
17+
input: {
18+
nums: [-1, 0, 3, 5, 9, 12],
19+
target: 3
20+
},
21+
expected: 2
22+
},
23+
{
24+
input: {
25+
nums: [-1, 0, 3, 5, 9, 12],
26+
target: 5
27+
},
28+
expected: 3
29+
},
30+
{
31+
input: {
32+
nums: [-1, 0, 3, 5, 9, 12],
33+
target: 9
34+
},
35+
expected: 4
36+
},
37+
{
38+
input: {
39+
nums: [-1, 0, 3, 5, 9, 12],
40+
target: 12
41+
},
42+
expected: 5
43+
},
44+
{
45+
input: {
46+
nums: [-1, 0, 3, 5, 9, 12],
47+
target: 2
48+
},
49+
expected: -1
50+
}
51+
]

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /