33 Search in Rotated Sorted Arrays

两遍binary search 注意写搜索的时候,边界判断条件。还有编写二分搜索的时候,需要多注意边界溢出的问题。二分的边界按照固定的方法来写。

二分搜素需要注意,区间开闭的问题。

Python

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        def find_rotate_index(left, right):
            if nums[left] < nums[right]:
                return 0

            while left <= right:
                pivot = (left + right)//2
                if nums[pivot] > nums[pivot + 1]:
                    return pivot + 1
                else:
                    if nums[pivot] < nums[left]:
                        right = pivot - 1
                    else:
                        left = pivot + 1

        def search(left, right):
            while left <= right:
                pivot = (left + right) //2
                if nums[pivot] == target:
                    return pivot
                else:
                    if nums[pivot] < target:
                        left = pivot + 1
                    else:
                        right = pivot - 1
            return -1

        n = len(nums)
        if n == 0:
            return -1
        if n == 1:
            return 0 if nums[0] == target else -1

        rotate_index = find_rotate_index(0, n-1)
        if nums[rotate_index] == target:
            return rotate_index
        else:
            if rotate_index == 0:itn
                return search(0, n - 1)
            if target < nums[0]:
                return search(rotate_index, n - 1)
            return search(0, rotate_index)

Java

class Solution {
    public int subsearch(int[] nums, int left, int right, int target){
        while(left <= right){
            int pivot = left + (right - left)/2;
            if (nums[pivot] == target)
                return pivot;
            else
            {
                if (nums[pivot] < target)
                    left = pivot + 1;
                else
                    right = pivot - 1;
            }
        }
        return -1;
    }
    public int find_rotate_index(int[] nums, int left, int right){
        if(nums[left] < nums[right]){
            return 0;
        }
        while(left <= right){
            int pivot = left + (right - left)/2;
            if (nums[pivot] > nums[pivot + 1])
                return pivot + 1;
            else
            {
                if(nums[pivot] < nums[left])
                    right = pivot - 1;
                else
                    left = pivot + 1;
            }
        }
        return 0;
    }
    public int search(int[] nums, int target) {
        int n = nums.length;
        if (n == 0)
            return -1;
        if (n == 1)
            return (nums[0] == target ? 0 : -1);
        int rotate_index = this.find_rotate_index(nums, 0, n - 1);
        if (nums[rotate_index] == target)
            return rotate_index;
        else
        {
            if (rotate_index == 0)
                return this.subsearch(nums, 0, n - 1, target);
            if (target < nums[0])
                return this.subsearch(nums, rotate_index, n - 1, target);
            return this.subsearch(nums, 0, rotate_index - 1, target);
        }
    } 
}

results matching ""

    No results matching ""