假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [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

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

被折叠的 条评论
为什么被折叠?



