Skip to content

Commit 01ccda9

Browse files
committed
add: Search for a Range
1 parent 4ad4079 commit 01ccda9

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Progress: 20/
1313
|19|[Remove Nth Node From End of List](https://leetcode.com/problems/remove-nth-node-from-end-of-list/) | [JavaScript](./src/remove-nth-node-from-end-of-list/res.js)|Medium|
1414
|22|[Generate Parentheses](https://leetcode.com/problems/generate-parentheses/) | [JavaScript](./src/generate-parentheses/res.js)|Medium|
1515
|26|[Remove Duplicates from Sorted Array](https://leetcode.com/problems/remove-duplicates-from-sorted-array/) | [JavaScript](./src/remove-duplicates-from-sorted-array/res.js)|Easy|
16+
|34|[Search for a Range](https://leetcode.com/problems/search-for-a-range/) | [JavaScript](./src/search-for-a-range/res.js)|Medium|
1617
|48|[Rotate Image](https://leetcode.com/problems/rotate-image/) | [JavaScript](./src/rotate-image/res.js)|Medium|
1718
|66|[Plus One](https://leetcode.com/problems/plus-one/) | [JavaScript](./src/plus-one/res.js)|Easy|
1819
|69|[Sqrt(x)](https://leetcode.com/problems/sqrtx/) | [JavaScript](./src/sqrtx/res.js)|Easy|

src/search-for-a-range/res.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Given an array of integers sorted in ascending order, find the starting and ending position of a given target value.
2+
3+
// Your algorithm's runtime complexity must be in the order of O(log n).
4+
5+
// If the target is not found in the array, return [-1, -1].
6+
7+
// For example,
8+
// Given [5, 7, 7, 8, 8, 10] and target value 8,
9+
// return [3, 4].
10+
11+
/**
12+
* res.js
13+
* @authors Joe Jiang ([email protected])
14+
* @date 2017-02-26 22:56:22
15+
* @version $Id$
16+
*
17+
* @param {number[]} nums
18+
* @param {number} target
19+
* @return {number[]}
20+
*/
21+
let searchRange = function(nums, target) {
22+
let arrlen = nums.length;
23+
if (!arrlen) {
24+
return [-1, -1];
25+
}
26+
27+
let leftIndex = binarySearch(nums, 0, arrlen-1, target, 'l'), rightIndex;
28+
if (leftIndex === -1) {
29+
return [-1, -1];
30+
} else {
31+
rightIndex = binarySearch(nums, leftIndex, arrlen-1, target, 'r');
32+
}
33+
34+
return [leftIndex, rightIndex];
35+
};
36+
37+
let binarySearch = function(nums, begin, end, target, type) {
38+
let arrlen = nums.length;
39+
while (begin <= end) {
40+
let mid = begin + Number.parseInt( (end-begin)/2 ),
41+
midVal = nums[mid];
42+
43+
if (midVal === target) {
44+
switch (type) {
45+
case 'l':
46+
if (mid === 0 || nums[mid-1] !== target) {
47+
return mid;
48+
} else {
49+
end = mid-1;
50+
}
51+
break;
52+
default:
53+
if (mid === arrlen-1 || nums[mid+1] !== target) {
54+
return mid;
55+
} else {
56+
begin = mid+1;
57+
}
58+
break;
59+
}
60+
} else if (midVal > target) {
61+
end = mid-1;
62+
} else if (midVal < target) {
63+
begin = mid+1;
64+
}
65+
}
66+
67+
return -1;
68+
};

0 commit comments

Comments
 (0)