题目: 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
- 你可以设计并实现时间复杂度为
O(log n)的算法解决此问题吗? 题目链接
我的JavaScript解法:
- 利用JavaScript语法优势
var searchRange = function(nums, target) {
const start = nums.indexOf(target);
const end = nums.lastIndexOf(target);
return [start, end];
};
- 利用算法,二分查找法
二分查找的递归实现
var searchRange = function(nums, target) {
return binarySearch(nums, 0, nums.length-1, target);
};
var binarySearch = (nums, left, right, target) => {
if (left <= right) {
let mid = ~~((left + right) / 2);
if (target < nums[mid]){
return binarySearch(nums, left, mid-1, target);
} else if(target > nums[mid]){
return binarySearch(nums, mid+1, right, target);
} else {
start = mid-1;
end = mid+1;
while (target == nums[start] && start >=0) start--;
while (target == nums[end] && end < nums.length) end++;
return [start+1, end-1];
}
}
return [-1, -1];
}
二分查找的循环实现
var searchRange = function(nums, target) {
let left = 0, let right = nums.length - 1;
while (left <= right) {
let mid = ~~((left + right) / 2);
if (nums[mid] === target) {
left = mid - 1;
right = mid + 1;
while (true) {
if (nums[left] === target) {
left--;
} else if (nums[right] === target) {
right++;
} else return [left + 1, right - 1];
}
}
if (target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return [-1, -1];
};