【JS】 搜索旋转排序数组 #数组 #二分查找

本文介绍了一种在旋转排序数组中搜索目标值的算法,详细解释了如何利用二分查找法在O(logn)的时间复杂度内解决问题。文章通过具体示例展示了算法的实现过程,并附带了解决方案的代码。

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

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

示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4

示例 2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

示例 3:
输入: nums = [3,1], target = 1
输出: 1

示例 4:
输入: nums = [3,1], target = 3
输出: 0



解法一:

使用了 indexOf() 函数,定位最小数 min 和最大数 max
与目标值 target 对比大小确定 开始 lo 和结束 hi 的位置,
最后二分查找

// 2018/11/21 Web 上午

var search = function(nums, target) {
    var min=Math.min.apply(null,nums)
    var max=Math.max.apply(null,nums)
    var pos,lo,hi,mid,len=nums.length

    if(target>nums[len-1] ){
        pos = nums.indexOf(max)
        lo = 0;hi = pos
    }else{
        pos = nums.indexOf(min)
        lo=pos;hi=len-1
    }
    // console.log(lo,hi)
    while(lo<=hi){
        mid = Math.ceil((lo+hi)/2);
        if(nums[mid] == target) return mid;
        if(nums[mid] < target){
            lo = mid+1
        }else{
            hi = mid-1
        }
    }
    return -1;
};

196 / 196 个通过测试用例
执行用时:80 ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值