<LeetCode天梯>Day009 两个数组的交集 II | 初级算法 | Python

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: <LeetCode天梯>Day009 两个数组的交集 II | 初级算法 | Python

工作日,周三,实验室线路改造装修,工地一样,唉,来,今天和车神哥一起来提升自己的Python编程和面试能力吧,刷天梯~


以下为我的天梯积分规则:


每日至少一题:一题积分+10分

若多做了一题,则当日积分+20分(+10+10)

若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)


初始分为100分

若差一天没做题,则扣积分-10分(周六、周日除外注:休息)

坚持!!!


初级算法

刷题目录

数组


image.png

题干

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


示例1:


输入:nums1 = [1,2,2,1], nums2 = [2,2]

输出:[2,2]


示例2:


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

输出:[4,9]

image.png

分析:

目标是求得两数组的交集,那么,我们确定第一个数组的每一个数的个数,然后再去检索第二个数组中是否含有这个数,且此数的个数是多少个,求min()取最小值即可,即为交集的个数。

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        n1 = len(nums1)
        sum1 = []
        # 先对两数组进行排序
        nums1.sort()
        nums2.sort()
        for i_1 in range(n1):
            Minima = min(nums1.count(nums1[i_1]), nums2.count(nums1[i_1]))  # 取最小的值则为交集
            if Minima > 0:
                sum1.append(nums1[i_1])
                nums2.remove(nums1[i_1])  # 如果有相同的出现,则删除nums2数组的同一值,以防重复输出
        return sum1

效果嘛,感觉还能再继续优化

image.png

image.png

image.png

优化

好!咱们再继续优化优化算法

针对题干中进阶的问题,我们再继续改进下,nums1的数比nums2的少很多,那么我们是否需要判断数组的数,将小的放在前进行迭代,这样可以节省很多时间。然后若已经排好序,那么我们可以省去排序操作。

再来:

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        n1 = len(nums1)
        n2 = len(nums2)
        sum1 = []
        sum2 = []
      # 判断两数组的数谁最多
        if n1 > n2:
            for idx in range(n2):
                Minima1 = min(nums1.count(nums2[idx]), nums2.count(nums2[idx]))
                if Minima1 > 0:
                    sum1.append(nums2[idx])
                    nums1.remove(nums2[idx])
            return sum1
        else:
            for i_1 in range(n1):
                Minima2 = min(nums1.count(nums1[i_1]), nums2.count(nums1[i_1]))
                if Minima2 > 0:
                    sum2.append(nums1[i_1])
                    nums2.remove(nums1[i_1])  # 如果有相同的出现,则删除nums2数组的同一值,以防重复输出
            return sum2

image.png

效果还是不是很好,再优化

        dict_1 = collections.defaultdict(int)
        dict_2 = collections.defaultdict(int)
        for x in nums1:
            dict_1[x] += 1
        for x in nums2:
            dict_2[x] += 1
        result = []
        for k in dict_1.keys():
            result.extend([k] * min(dict_1[k], dict_2[k]))
        return result

image.png


相关文章
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
240 0
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
513 1
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
前端开发
LeetCode------移动零(5)【数组】
这篇文章介绍了LeetCode上的"移动零"问题,提出了一种使用双指针的原地操作解法,该方法首先将非零元素移动到数组前端并保持相对顺序,然后填充后续位置为零,以达到题目要求。
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
230 4
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
304 0
Leetcode第三十三题(搜索旋转排序数组)
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置

推荐镜像

更多