Problem :当前的数组是一个经过排序之后的循环有序数组,但是该数组的主元选择并不一定是下标为i=0的第一个元素。
例如有序数组为:{1,2,3,4,5,6}
其循环有序数组可能为: {3,4,5,6,1,2}、 {6,1,2,3,4,5}、{4,5,6,1,2,3}等
进行查询操作,使用折半查找。
需要不断判断nums[mid] 与target
以及 target与 nums[start]
和 target与nums[end]的大小关系
if (nums[start] <= nums[mid]){//mid大于start if (target < nums[mid] && target >= nums[start])// target在start和mid之间 end = mid - 1; else start = mid + 1; } if (nums[mid] <= nums[end]){//mid小于end if (target > nums[mid] && target <= nums[end])//target在mid和end之间 start = mid + 1; else end = mid - 1; }
根据上述的关系,进行对start和end指针的更新操作。
直到 nums[mid] == target时,找到当前下标为mid
循环条件为while(start<=end)
参考代码:
package leetcode_50; /*** * * @author pengfei_zheng * 在数组中查找target 并返回其下标 */ public class Solution33 { public int search(int[] nums, int target) { int start = 0; int end = nums.length - 1; while (start <= end){ int mid = (start + end) / 2; if (nums[mid] == target) return mid; if (nums[start] <= nums[mid]){ if (target < nums[mid] && target >= nums[start]) end = mid - 1; else start = mid + 1; } if (nums[mid] <= nums[end]){ if (target > nums[mid] && target <= nums[end]) start = mid + 1; else end = mid - 1; } } return -1; } }