跟着leedcode刷算法 -- 数组4

86 阅读1分钟

这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

image.png

题7

两个数组的交集 II

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

示例 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:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:   
        res = []
        for row in nums1:
            if row in nums2:
                if nums1.count(row)<nums2.count(row):
                    if row not in res:
                        for _ in range(nums1.count(row)):
                            res.append(row)
                else:
                    if row not in res:
                        for _ in range(nums2.count(row)):
                            res.append(row)
        return res

执行结果:

image.png

题8

递增的三元子序列

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

如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [1,2,3,4,5]

输出:true

解释:任何 i < j < k 的三元组都满足题意

示例 2:

输入:nums = [5,4,3,2,1]

输出:false

解释:不存在满足题意的三元组

示例 3:

输入:nums = [2,1,5,0,4,6]

输出:true

解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6   提示:

1 <= nums.length <= 105

-231 <= nums[i] <= 231 - 1  

进阶:你能实现时间复杂度为 O(n) ,空间复杂度为 O(1) 的解决方案吗?

相关标签

  • 贪心
  • 数组
class Solution:
    def increasingTriplet(self, nums: List[int]) -> bool:
        '''
        滑动窗口问题 窗口大小为3 
        '''
        m = max(nums)
        n = max(nums)
        for i in range(len(nums)):
            if nums[i] <= m:
                m = nums[i]
            elif nums[i] <= n:
                n = nums[i]
            else:
                return True
        return False

执行结果:

image.png