二分查找及leetcode题

二分查找及leetcode题

二分查找

背景:

如何在一个严格递增序列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)

leetcode题目

题目一

题目:
题目

给定一个 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
思路:

因为是有序数组,通过数组中间元素与目标值进行比较,若相等则找到,小于则只可能在右边数组,大于则只可能在左边数组,直到数组为空。

坑点:

题目是找原数组元素下标,参数变化不应该是数组,而是数组下标。

代码:
javascript

/**
 * @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);
};

你可能感兴趣的:(leetcode,javascript,二分查找)