网站推广都做什么内容,宁波网站建设相信荣胜网络,wordpress用户邮箱验证码,连云港网站建设培训假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如#xff0c;数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值#xff0c;如果数组中存在这个目标值#xff0c;则返回它的索引#xff0c;否则返回 -1 。
你可以假设数组中不存在…假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如数组 [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
思路二分查找
每一次先判断mid在左边有序范围内还是右边有序范围内
1.如果在左边看target是不是比左边最小的数字大比左边最大的数字小
a.如果是那说明数字就在左边有序范围内或者不存在 b. 如果不是就说明左边有序范围不存在需要mid继续往右移动
2. 如果在右边看target是不是比右边最小的数字大比右边最大的数字小
a.如果是那说明数字就在右边有序范围内或者不存在 b. 如果不是就说明右边有序范围不存在需要mid继续往左移动
提交的代码
class Solution { public int search(int[] nums, int target) { int high nums.length-1; int low 0; int mid; mid low(high-low)/2; while(lowhigh) { if(nums[mid]target) { return mid; } if(nums[low]nums[mid]) //说明现在mid在左边 { if(targetnums[low]targetnums[mid])//说明这个数字在左边有序范围内 { high mid-1; } else //只能从右边找 { low mid1; } } else{ //mid在右边 if(target nums[mid] target nums[high]){//在右边有序范围内 low mid 1; }else{//只能从左边找 high mid-1; } } mid low(high-low)/2; } return -1; }
}