Example

For [4, 5, 1, 2, 3] and target=1, return 2.
For [4, 5, 1, 2, 3] and target=0, return -1.


这一道题和上一题很相近,在一个rotated的array里寻找target。
此题的难点在于, 由于array是旋转过的, 我们不知道target会落在哪里。仔细观察例子,可以发现,无论mid在哪里,start - mid 和mid - end这两个sub arrays, 总有一个是没有旋转过的正常的拍过序的。 有了这个信息, 我们就可以知道target是在没有旋转过的那一边还是在旋转过的那一边。这是此题的重要切入点,能够想到这里,这道题目就引刃而解了。

代码

class Solution:
    """
    @param: A: an integer rotated sorted array
    @param: target: an integer to be searched
    @return: an integer
    """
    def search(self, nums, target):
        if nums is None or len(nums) == 0:
            return -1
        start = 0
        end = len(nums) - 1
        while start + 1 < end:
            mid = start + (end - start) / 2
            if nums[mid] == target:
                return mid
            elif nums[start] < nums[mid]:
                if nums[start] <= target < nums[mid]:
                    end = mid
                else:
                    start = mid
            elif nums[mid] < nums[end]:
                if nums[mid] < target <= nums[end]:
                    start = mid
                else:
                    end = mid
            
        if nums[start] == target:
            return start
        elif nums[end] == target:
            return end
        else:
            return -1

总结

这道题目和 Find Minimum in Rotated Sorted Array 都是通过观察mid和start和end的关系来判断应该切掉哪一块的数组。仔细观察例子非常重要。


jocelynzz
1 声望0 粉丝

学习刷题专用博 ^_^