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

简介: <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


相关文章
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
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 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
700 1
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
1220 23
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
332 7
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
483 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
557 4
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
446 2
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
336 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
1039 0
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
617 2

热门文章

最新文章

推荐镜像

更多