leetcode 33. Search in Rotated Sorted Array

100 篇文章 0 订阅
'''
leetcode 33
在以某个索引位置为中心,对数组进行旋转后,得到算法的输入数组
给定目标值,要求以时间复杂度 O(log N) 从旋转数组中查找出目标值
如果找不到,则返回-1,找到,则返回目标值在旋转后的数组的位置

算法:
首先根据target目标值和数组第一个和最后一个元素的大小比较,确定搜索的方向
    如果target>nums[0] and target<nums[-1]
        说明当前的数组是升序排列的,故而应该从start=0,从前向后搜索
    如果target>nums[0] and target>nums[-1]
        说明当前数组是类似与  4  5  6 7   0  1 2  的形式,也应该start=0,从前向后搜索
    如果target<nums[0] and target<nums[-1]
        则应该从后向前搜索,end=len(nums)-1
    如果target<nums[0] and target>nums[-1]
        则无论是对于升序数组还是前升序后降序的数组,都无法搜索,返回-1
'''
class Solution:
    def search(self, nums, target: int) -> int:
        if(len(nums)==0):
            return -1
        if(len(nums)==1):
            if nums[0]==target:
                return 0
            else:
                return -1
        start=0
        end=len(nums)-1

        start_status=True
        end_status=True

        if (start_status and end_status):
            if nums[start]==target:
                return start
            if nums[end]==target:
                return end
            if nums[start]>target and nums[end]>target:#说明应该从后向前搜索
                start_status=False
            elif nums[start]>target and nums[end]<target:
                return -1
            else:
                end_status = False
            # elif nums[start]<target and nums[end]<target:#说明应该从前向后搜索
            #     end_status=False
            # else:

        # print(start_status,end_status)

        if start_status:
            start+=1
            # print(start)
            while(start<len(nums) and nums[start]>=nums[start-1]):
                while(nums[start]==nums[start-1]):
                    start+=1
                if nums[start]==target:
                    return start
                elif nums[start]<target:
                    start+=1
                else:
                    return -1
            return -1
        if end_status:
            end-=1
            while(end>=0 and nums[end]<=nums[end+1]):
                while(nums[end]==nums[end+1]):
                    end-=1
                if nums[end]==target:
                    return end
                elif nums[end]>target:
                    end-=1
                else:
                    return -1
            return -1

if __name__=="__main__":
    print(Solution().search([1,3,5],3))



上述算法在最坏的情况下仍然是线性复杂度。

Runtime: 36 ms, faster than 94.74% of Python3 online submissions forSearch in Rotated Sorted Array.

'''
33. Search in Rotated Sorted Array
题目中要求的时间复杂度是 O(log N),很容易联想到二分查找
https://www.bilibili.com/video/av46411485?from=search&seid=10565559742785267521
'''
class Solution:
    def search(self, nums, target: int) -> int:
        if len(nums)==0:
            return -1
        if len(nums)==1:
            if nums[0]==target:
                return 0
            else:
                return -1
        start=0
        end=len(nums)-1

        while(start<end):
            if nums[start]==target:
                return start
            if nums[end]==target:
                return end
            mid=(start+end)//2
            if nums[mid]==target:
                return mid
            elif nums[mid]>target:
                if nums[0]<nums[mid]:# mid落在大子数组中
                    if target>nums[mid]:
                        end=mid-1
                    else:
                        start=mid+1
                else:# mid落在小子数组中
                    if target>nums[mid]:
                        



 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值