您的位置:首页 > 编程语言 > Python开发

用python写leetcode【7】 --两个数组的交集 II(350)、递增的三元子序列(334)

2019-03-14 13:30 591 查看

文章目录

  • 递增的三元子序列(334)
  • 两个数组的交集 II(350)

    题目

    给定两个数组,编写一个函数来计算它们的交集。

    示例 1:

    输入: nums1 = [1,2,2,1], nums2 = [2,2]
    输出: [2,2]
    示例 2:

    输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    输出: [4,9]
    说明:

    输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
    我们可以不考虑输出结果的顺序。
    进阶:

    如果给定的数组已经排好序呢?你将如何优化你的算法?
    如果 nums1 的大小比 nums2 小很多,哪种方法更优?
    如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

    思路

    将两个数组排序,然后用指针遍历判断

    代码

    class Solution(object):
    def intersect(self, nums1, nums2):
    """
    :type nums1: List[int]
    :type nums2: List[int]
    :rtype: List[int]
    """
    
    ans = []
    nums1.sort()
    nums2.sort()
    i = j = 0
    while i<len(nums1) and j < len(nums2):
    if nums1[i] == nums2[j]:
    ans.append(nums1[i])
    i+=1
    j+=1
    elif nums1[i] < nums2[j]:
    i+=1
    else:
    j+=1
    return ans

    递增的三元子序列(334)

    题目

    给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。

    数学表达式如下:

    如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,
    使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。
    说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。

    示例 1:

    输入: [1,2,3,4,5]
    输出: true
    示例 2:

    输入: [5,4,3,2,1]
    输出: false

    思路

    创建两个变量分别用于存放目前的第一小的数a和第二小的数b,遍历数组,如果有数大于第二小的数,则成功,如果数小于最小的数a,则把该数赋值a,如果该数在a-b之间,则把该数赋值给b。整体思路就是记录三元数组中前两个值为a,b,并不断更新a,b已获得最有可能成功的组合。

    代码

    class Solution:
    def increasingTriplet(self, nums):
    """
    :type nums: List[int]
    :rtype: bool
    """
    res = [float('inf'), float('inf')]
    for n in nums:
    if n > res[1]:
    return True
    if n <= res[0]:
    res[0] = n
    else:
    res[1] = n
    return False
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: