leetcode第34题在排序数组中查找元素的第一个和最后一个位置

52 阅读1分钟

题目: 给定一个按照升序排列的整数数组 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];
};