xszi / javascript-algorithms

算法修炼中...
5 stars 0 forks source link

在排序数组中查找元素的第一个和最后一个位置 #89

Open xszi opened 3 years ago

xszi commented 3 years ago

给定一个按照升序排列的整数数组 nums,和一个目标值 target 。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是O(logn)级别。

如果数组中不存在目标值,返回 [-1, -1]

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

leetcode

xszi commented 3 years ago

let leftSearch = function(nums, target) { let low = 0, high = nums.length - 1, mid while (low <= high) { mid = Math.floor((low+high)/2) if (nums[mid] < target) { low = mid + 1 } else if (nums[mid] > target) { high = mid - 1 } else if (nums[mid] === target) { // 这里不返回,继续收缩左侧边界 high = mid - 1 } } // 最后检查 low 是否越界或命中 if (low >= nums.length || nums[low] != target) return -1 return low }

let rightSearch = function (nums, target) { let low = 0, high = nums.length - 1, mid while (low <= high) { mid = Math.floor((low+high)/2) if (nums[mid] < target) { low = mid + 1 } else if (nums[mid] > target) { high = mid - 1 } else if (nums[mid] === target) { // 这里不返回,继续收缩右侧边界 low = mid + 1 } } // 最后检查 high 是否越界或命中 if (high < 0 || nums[high] != target) return -1 return high }


复杂度分析:

* 时间复杂度:O(logn) 
* 空间复杂度:O(1)