Fork me on GitHub

LeetCode 33 Search in Rotated Sorted Array(循环有序数组中进行查找操作)

 
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;
    }
}

 

 
posted @ 2017-03-10 17:30  伊甸一点  阅读(1197)  评论(0编辑  收藏  举报