数组
二分查找
- leetCode704
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。
const search = (nums, target) => {
let left = 0,
right = nums.length - 1
while (left <= right) {
let middle = left + parseInt(right - left / 2)
if (nums[middle] > target) {
right = middle - 1
} else if (nums[middle] < target) {
left = right + 1
} else {
return middle
}
}
return -1
}
console.log(search([1, 2, 3, 4, 5], 5))
- leetCode35
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
输入: nums = [1,3,5,6], target = 5
输出: 2
输入: nums = [1,3,5,6], target = 5
输出: 2
const search = (nums, target) => {
let left = 0,
right = nums.length - 1
while (left <= right) {
let middle = left + parseInt(right - left / 2)
if (nums[middle] > target) {
right = middle - 1
} else if (nums[middle] < target) {
left = right + 1
} else {
return middle
}
}
return -1
}
console.log(search([1, 2, 3, 4, 5], 5))
- leetCode34在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
const first = (nums, target) => {
let left = 0,
right = nums.length - 1
while (left < right) {
let middle = parseInt((right + left) / 2)
if (nums[middle] == target) {
right = middle
} else if (nums[middle] < target) {
left = middle + 1
} else {
right = middle - 1
}
}
if (nums[left] == target) {
return left
}
return -1
}
const end = (nums, target) => {
let left = 0,
right = nums.length - 1
while (left < right) {
let middle = parseInt((right + left + 1) / 2)
if (nums[middle] == target) {
left = middle
} else if (nums[middle] < target) {
left = middle + 1
}