题解 | #在旋转过的有序数组中寻找目标值#

在旋转过的有序数组中寻找目标值

http://www.nowcoder.com/practice/87c0e7abcbda41e7963660fa7d020995

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] nums, int target) {
        // write code here
        return dealNums(nums, 0, nums.length - 1, target);

    }

    private int dealNums(int[] nums, int left, int right, int target) {
        int result = -1;
        if(left > right) {
            return result;
        }
        int mid = (left + right)/2;
        if(nums[mid] < nums[left]) {
            result = dealNums(nums, left, mid - 1, target);
            if(result != -1) {
                return result;
            }
            result = binarySearch(nums, mid, right, target);
            if(result != -1) {
                return result;
            }
        } else if(nums[mid] > nums[right]) {
            result = binarySearch(nums, left, mid, target);
            if(result != -1) {
                return result;
            }
            result = dealNums(nums, mid + 1, right, target);
            if(result != -1) {
                return result;
            }
        } else {
            result = binarySearch(nums, left, right, target);
            if(result != -1) {
                return result;
            }
        }
        return result;
    }

    private int binarySearch(int[] nums, int left, int right, int target) {
        while(left <= right) {
            int mid = (left + right)/2;
            int temp = nums[mid];
            if(temp == target) {
                return mid;
            } else if(target < temp) {
                right = mid - 1;
            } else if(target > temp) {
                left = mid + 1;
            }
        }
        return -1;
    }
}

思路为:不断将整个数组切分为确定有序,和不确定有序两部分。并在有序部分使用二分查找。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务