LeetCode_33. Search in Rotated Sorted Array 在有一个转折的有序数组中查找某元素,二分法

题目:

Suppose an array sorted in ascending order 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.

Your algorithm's runtime complexity must be in the order of O(log n).

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

 

代码:

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        
        # 二分查找法
        left = 0                 #查找的下标
        right = len(nums) -1     #查找的上标
        
        while left <= right :
            mid = (left + right)/2
            if nums[mid] == target :
                return mid
            if nums[left] <=  nums[mid] :   #确定有顺序的部分:如果nums[left]<nums[mid],则left到mid的部分数据有序(如果nums[left]=nums[mid],说明左边这段只有一个元素,要考虑到这个特殊情况);如果nums[mid]<nums[right],则是mid到right这部分数据是有序的。确定了有序的序列后,再判断要查找的数在不在有序序列里,并相应跟新查找的上下标left和right
                if nums[left] <=  target <= nums[mid] :
                    right = mid -1
                else :
                    left = mid +1
            else :   #否则,mid到right部分的数据有序
                if nums[mid] <=  target <= nums[right] :
                    left = mid + 1
                else :
                    right = mid -1
        return -1

 

关键是确定有序的部分,通过左右两端的数据与中间数据比较,如果left的数据比mid的小,则left到mid是有序的;如果mid的数据比right的小,则mid到right的部分数据是有序的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值