0125leetcode刷题5道python

33

题目描述;
升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。
请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

示例:
在这里插入图片描述
解答:

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        '''
        ①
        for i in range(len(nums)):
            if nums[i]==target:
                return i
        return -1
        ②
        if target in nums:
            return nums.index(target)
        else:
            return -1
        '''
        if len(nums)==0:
            return -1

        left,right=0,len(nums)-1
        while left<right:
            mid=(left+right)//2
            if nums[mid]<nums[right]:  #[mid,right]部分有序
                if nums[mid]<target<=nums[right]:
                    left=mid+1
                else:
                    right=mid
            else:                    #[1,mid]有序
                if nums[left]<=target<=nums[mid]:
                    right=mid
                else:
                    left=mid+1
        if nums[left]!=target:
            return -1
        else:
            return left 

34

题目描述:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。

示例:
在这里插入图片描述
解答:

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        '''
        try:
            return [nums.index(target),len(nums)-nums[::-1].index(target)-1]
        except ValueError:
            return [-1,-1]
        '''
        a=bisect_left(nums,target)      #左侧位置
        b=bisect_right(nums,target)-1   #右侧的后一个位置
    
        if b>=a:
            return [a,b]
        else:
            return [-1,-1]

81

题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

示例:
在这里插入图片描述
解答:

class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        '''
        ①
        for i in range(len(nums)):
            if nums[i]==target:
                return True
        return False
        ②
        return target in nums
        '''
        n=len(nums)
        left,right=0,n-1
        while left<right:
            if nums[left]==nums[left+1]:
                left+=1
                continue
            elif nums[right-1]==nums[right]:
                right-=1
                continue

            mid=(left+right)//2
            if nums[left]<nums[mid]:
                if nums[left]<=target<=nums[mid]:
                    right=mid
                else:
                    left=mid+1
            else:
                if nums[mid+1]<=target<=nums[right]:
                    left=mid+1
                else:
                    right=mid
        return nums[left]==target
        

153

题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。
请找出其中最小的元素。

示例:
在这里插入图片描述
解答:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        '''
        return min(nums)
        '''
        if len(nums)<=1:
            return nums[0]
        if nums[-1]>=nums[0]:
            return nums[0]
        mid=(len(nums)-1)//2
        if nums[mid]>=nums[0]:
            return self.findMin(nums[mid+1:])
        else:
            return self.findMin(nums[:mid+1])

154

题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
注意数组中可能存在重复的元素。

示例:
在这里插入图片描述
解答:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        '''
        return min(nums)
        '''
        if len(nums)==1:
            return nums[0]
        mid=(len(nums)-1)//2
        if nums[mid]>nums[-1]:
            return self.findMin(nums[mid+1:])
        elif nums[mid]<nums[-1]:
            return self.findMin(nums[:mid+1])
        else:
            if len(nums)>1:
                nums.pop(mid)
            return self.findMin(nums)

猜你喜欢

转载自blog.csdn.net/yeqing1997/article/details/113080366