如何在一个严格递增序列A中找到给定数x,最直接方法按顺序查找,复杂度为O(n),如果A个数太大,查询速度很慢,更好方法是使用二分查找。
二分查找是基于有序序列查找方法(以严格递增为例),一开始令[left,right]为整个序列下标,找到中间值mid=(left+right)/2,与x进行比较:
1.A[mid]==x => 查找成功,退出查询
2.A[mid]>x => x在mid位置左边,往 [left,mid-1]查找
3.A[mid] x在mid位置右边,往 [mid+1,right]查找
二分查找复杂度为O(log n)
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
输入:
nums = [-1,0,3,5,9,12], target = 9
输出:
4
输入:
nums = [-1,0,3,5,9,12], target = 2
输出:
-1
因为是有序数组,通过数组中间元素与目标值进行比较,若相等则找到,小于则只可能在右边数组,大于则只可能在左边数组,直到数组为空。
题目是找原数组元素下标,参数变化不应该是数组,而是数组下标。
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
//在nums[start,end)数组找值为target的下标
var search1=function(nums,target,start,end){ //数组[start,end)
while(end>start){ //数组长度不为空
mid=parseInt((start+end)/2); //中间元素下标
if(nums[mid]==target)
return mid;
if(nums[mid]>target)
end=mid;
if(nums[mid]<target)
start=mid+1;
}
return -1; //数组为空返回-1
}
var search = function(nums, target) {
return search1(nums,target,0,nums.length);
};