LintCode刷题62:旋转数组查找---Search in Rotated Sorted Array

这篇文章讲解的是LintCode第62题:旋转数组查找—Search in Rotated Sorted Array

题目描述链接

Description
Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Have you met this question in a real interview?  
Example
Example 1:

Input: [4, 5, 1, 2, 3] and target=1, 
Output: 2.
Example 2:

Input: [4, 5, 1, 2, 3] and target=0, 
Output: -1.

大意是在一个旋转的有序数组中寻找一个target,如果存在则返回其索引值,不存在则返回-1.

这道题目可以用二分查找来完成。
首先脑海中就将这个旋转后的递增数组想象成为一个双曲线。
1.初始化start、end两个索引值分别为0和数组长度-1 。
2.计算mid索引值。判断:

  • 假如mid处的值等于target,则返回mid
  • 如果A[mid]大于等于A[start],则说明mid处于输入数组的递增的前半部分。因此判断前半部分的情况:如果A[start]小于等于target并且target小于等于A[mid],则令end = mid,再来循环计算。
  • 如果A[mid]小于A[start],则说明mid处于输入数组的递增的后半部分。即下图的绿色部分。因此判断后半部分的情况:如果A[mid]小于等于target并且target小于等于A[end],则令end = mid,再来循环计算。
    形象表示
    python代码如下:
class Solution:
    """
    @param A: an integer rotated sorted array
    @param target: an integer to be searched
    @return: an integer
    """
    def search(self, A, target):
        # write your code here
        if A == None or len(A) == 0:
            return -1
        start, end = 0, len(A) - 1
        while start + 1 < end:
            mid = start + (end - start) // 2
            if A[mid] == target:
                return mid
            if A[start] < A[mid]:
                if A[start] <= target and target <= A[mid]:
                    end = mid
                else:
                    start = mid
            else:
                if A[mid] <= target and target <= A[end]:
                    start = mid
                else:
                    end = mid
        if A[start] == target:
            return start
        if A[end] == target:
            return end
        return -1

其中注意几个点:

  1. while的判断条件是start + 1 < end,这样避免死循环和后面出现不必要的判断;
  2. mid = start + (end - start) // 2能避免值溢出;
  3. A在和target比较大小时加上=。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值