zoukankan      html  css  js  c++  java
  • 力扣 2020.07.31

    08.03 魔术索引

    题目

    魔术索引。 在数组A[0...n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。

    思路

    讲真,这题。。。我不想说啥了。。。就是返回第一个nums[i]=i的下标。。。

    代码

    class Solution:
        def findMagicIndex(self, nums: List[int]) -> int:
            for i in range(len(nums)):
                if i == nums[i]:
                    return i
            return -1
    

    复杂度分析

    时间复杂度:O(n)

    空间复杂度:O(1)

     

     

    04 寻找两个正序数组中的中位数

    题目

    给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。

    请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

    你可以假设 nums1 和 nums2 不会同时为空。

    思路

    由于题目规定了时间复杂度为O(log(m+n)),所以比较合适的算法为二分查找。

    代码

    class Solution:
        def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
            def getKthElement(k):
                """
                - 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较
                - 这里的 "/" 表示整除
                - nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共计 k/2-1 个
                - nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共计 k/2-1 个
                - 取 pivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个
                - 这样 pivot 本身最大也只能是第 k-1 小的元素
                - 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums1 数组
                - 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums2 数组
                - 由于我们 "删除" 了一些元素(这些元素都比第 k 小的元素要小),因此需要修改 k 的值,减去删除的数的个数
                """
                
                index1, index2 = 0, 0
                while True:
                    # 特殊情况
                    if index1 == m:
                        return nums2[index2 + k - 1]
                    if index2 == n:
                        return nums1[index1 + k - 1]
                    if k == 1:
                        return min(nums1[index1], nums2[index2])
    
                    # 正常情况
                    newIndex1 = min(index1 + k // 2 - 1, m - 1)
                    newIndex2 = min(index2 + k // 2 - 1, n - 1)
                    pivot1, pivot2 = nums1[newIndex1], nums2[newIndex2]
                    if pivot1 <= pivot2:
                        k -= newIndex1 - index1 + 1
                        index1 = newIndex1 + 1
                    else:
                        k -= newIndex2 - index2 + 1
                        index2 = newIndex2 + 1
            
            m, n = len(nums1), len(nums2)
            totalLength = m + n
            if totalLength % 2 == 1:
                return getKthElement((totalLength + 1) // 2)
            else:
                return (getKthElement(totalLength // 2) + getKthElement(totalLength // 2 + 1)) / 2
    

    复杂度分析

    时间复杂度: O(log(m+n))

    空间复杂度:O(1)

  • 相关阅读:
    Jdk1.7 与 jdk1.8的区别,最新的特征有哪些(美团,360,京东面试题目)
    Android利用zxing生成二维码
    Android 事件传递机制
    Android 如何让EditText不自动获取焦点&隐藏软键盘
    Android--控件的滑动事件
    解决Android3.0之后不能在主线程中进行HTTP请求
    JavaIO 思维导图
    MySQL的注释方法
    MySQL——约束(constraint)详解
    自动回复之实现随机回复与常用Mapper XML标签
  • 原文地址:https://www.cnblogs.com/young233/p/13411087.html
Copyright © 2011-2022 走看看