0126leetcode刷题5道python

4

题目描述:
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。

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

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        '''
        取两个数组中的第k/2个元素进行比较,
        如果数组1的元素小于数组2的元素,则说明数组1中的前k/2个元素不可能成为第k个元素的候选,
        所以将数组1中的前k/2个元素去掉,组成新数组和数组2求第k-k/2小的元素,
        因为我们把前k/2个元素去掉了,所以相应的k值也应该减小。
        另外就是注意处理一些边界条件问题,比如某一个数组可能为空或者k为1的情况。
        '''
        def findKthElement(arr1,arr2,k):
            len1,len2 = len(arr1),len(arr2)
            if len1>len2:
                return findKthElement(arr2,arr1,k)
            if not arr1:
                return arr2[k-1]
            if k == 1:
                return min(arr1[0],arr2[0])
            i,j = min(k//2,len1)-1,min(k//2,len2)-1
            if arr1[i] > arr2[j]:
                return findKthElement(arr1,arr2[j+1:],k-j-1)
            else:
                return findKthElement(arr1[i+1:],arr2,k-i-1)
        l1,l2 = len(nums1),len(nums2)
        left,right = (l1+l2+1)//2,(l1+l2+2)//2
        return (findKthElement(nums1,nums2,left)+findKthElement(nums1,nums2,right))/2

278

题目描述;
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

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

# The isBadVersion API is already defined for you.
# @param version, an integer
# @return an integer
# def isBadVersion(version):

class Solution:
    def firstBadVersion(self, n):
        """
        :type n: int
        :rtype: int
        """
        high=n
        low=1
        while low<high:
            mid=(low+high)//2
            if isBadVersion(mid):
                high=mid
            else:
                low=mid+1
        return low

374

题目描述:
猜数字游戏的规则如下:
每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num

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

# The guess API is already defined for you.
# @param num, your guess
# @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
# def guess(num: int) -> int:

class Solution:
    def guessNumber(self, n: int) -> int:
        left=1
        right=n
        while left<right:
            mid=(left+right)//2
            res=guess(mid)
            if res==1:
                left=mid+1
            else:
                right=mid
        return left

852

题目描述:
符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的下标 i 。

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

class Solution:
    def peakIndexInMountainArray(self, arr: List[int]) -> int:
        '''
        return arr.index(max(arr))
        '''
        n=len(arr)
        left,right=0,n-1
        while left<=right:
            mid=(left+right)//2
            if arr[mid-1]<arr[mid] and arr[mid]>arr[mid+1]:
                return mid
            elif arr[mid-1]<arr[mid] and arr[mid]<arr[mid+1]:
                left=mid+1
            else:
                right=mid-1


1095

题目描述:
(这是一个 交互式问题 )
给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。
如果不存在这样的下标 index,就请返回 -1。
何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:
首先,A.length >= 3
其次,在 0 < i < A.length - 1 条件下,存在 i 使得:
A[0] < A[1] < … A[i-1] < A[i]
A[i] > A[i+1] > … > A[A.length - 1]
你将 不能直接访问该山脉数组,必须通过 MountainArray 接口来获取数据:
MountainArray.get(k) - 会返回数组中索引为k 的元素(下标从 0 开始)
MountainArray.length() - 会返回该数组的长度

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

# """
# This is MountainArray's API interface.
# You should not implement it, or speculate about its implementation
# """
#class MountainArray:
#    def get(self, index: int) -> int:
#    def length(self) -> int:

class Solution:
    def findInMountainArray(self, target: int, mountain_arr: 'MountainArray') -> int:
        
        n = mountain_arr.length()
        left, right = 0, n - 1
        
        # 二分寻找山顶(162,寻找峰值)
        while(left < right):
            mid = (left + right + 1) >> 1
            # 左边有序, 可以排除 0 ~ i -1
            if mountain_arr.get(mid) > mountain_arr.get(mid - 1):
                left = mid
            else:
                right = mid - 1

        top_idx = left

        # # 在左边寻找 >= target 的左边界
        left, right = 0, top_idx
        while(left < right):
            mid = (left + right) >> 1
            if mountain_arr.get(mid) >= target:
                right = mid
            else:
                left = mid + 1

        # 刚好等于 target, 直接返回
        if (mountain_arr.get(left) == target):
            return left

        # 右边找 <= target 的左边界
        left, right = top_idx, n - 1
        while(left < right):
            mid = (left + right) >> 1 
            if mountain_arr.get(mid) <= target:
                right = mid
            else:
                left = mid + 1

        return left if mountain_arr.get(left) == target else -1

猜你喜欢

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