【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素

简介: 【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素

接触了代码,那么算法始终是绕不开的一个重点。


算法对于开发人员,在日常之中的作用很大,但是对于测试人员来说,实际编码中用到的似乎不是很多。


不过,现在大厂的测试开发的面试,算法是必考的,而且这也的确是你的代码功底的一项重要体现,学学没坏处。


1268169-20201217142744844-1876337476.png


关于算法的基础知识,之前自己也买过书,但是学习的断断续续的,练习刷题就更加稀少了。


所以,打算日后做一个【简单算法】的记录:


  • 第一,是为了梳理解题思路,加深巩固。
  • 第二,在学习解题的过程中,将薄弱的代码环节、算法基础补全。
  • 第三,算是对算法练习的一个督促。


题目来自LeetCode传送门,有兴趣的童鞋可以到上面刷题练习。


一、题目:两数之和


描述


给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。


你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。


示例


给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]


解题


突然有了考试做题的感觉,我觉得首先题目要先审清楚,然后自己尝试用自己已有的知识去解决。


实在做不出来,也别泄气,算法道路一定是曲折的,起码对我来说是这样,大佬除外。

另外,不管做不做出来,都要去学习下示例解法,学习解题思路,从中收获更多。


1. 解法1


我自己尝试着做,这题因为属于简单难度,我用for循环的知识进行了暴力破解,代码以为例:


def twoSum(nums, target):
    for i in range(len(nums)):
        for j in range(i+1, len(nums)):
            if nums[i] + nums[j] == target:
                return [i, j]


其实就是2次循环,最外层的循环,从列表第一个开始遍历,直到最后一个元素,长度就是len(nums)


因为题目中说,单元素不能使用两次,所以内层的循环,就从i 之后也就是i+1开始,直到最后一个元素。


拿到了2个数,就进行相加操作,与target进行比较,如果相等,就返回出这2个元素的下标。


运行一下:


def twoSum(nums, target):
    for i in range(len(nums)):
        for j in range(i+1, len(nums)):
            if nums[i] + nums[j] == target:
                return [i, j]
if __name__ == "__main__":
    print(twoSum2([2, 15, 11, 7], 9))
-------------结果----------------------
D:\Programs\Python\Python36\python.exe D:/练习/leecode/two_sum.py
[0, 3]
Process finished with exit code 0


这题虽然我做出来,但是这个解法并不好,如果遇到一个元素很多的列表,并且最后的2个值 之和 等于目标值,那么这种情况下,

数组里的任意2个元素都要匹配比较一次。


时间复杂度就为:O(N^2)。

空间复杂度还好,因为没去去开辟额外的空间去计算,所以是:O(1)。

关于复杂度的分析,后面单独写一篇介绍。


2. 解法2


上面的解法缺点就是在最坏的时候,数组里的任意2个元素都要匹配比较一次,那么就要来解决这个问题。


换个思路来想,遍历列表的中的元素x,如果列表中存在 target-x,那么这2个数的下标就是最终我们要的结果。


官方的建议解法用了哈希表,对于key-value这样的存储形式,x跟它的下标是对应的,这样一来,找到target-x的时间复杂度就变成了O(1)。


所以新的解法就是:


def twoSum2(nums, target):
    hashtable = dict()
    for i, num in enumerate(nums):
        if target - num in hashtable:
            return [hashtable[target - num], i]
        hashtable[nums[i]] = i
    return []



在每一次的遍历中,就可以用目标值 target —— 当前元素 num,判断这个值 在不在字典里。


这里用到的是 字典 in 操作符,用于判断键是否存在于字典中。


如果在的话,那就返回 字典里的 元素以及,下标。


因为刚开始循环的的时候,字典里没数据,所以当每次循环后,我们要把这次循环的元素跟它的下标 分别 作为 key和value放到字典里去。


可以加个打印看下 字典的操作过程:


def twoSum2(nums, target):
    hashtable = dict()
    for i, num in enumerate(nums):
        if target - num in hashtable:
            return [hashtable[target - num], i]
        hashtable[nums[i]] = i
        print(hashtable)
    return []
if __name__ == "__main__":
    print(twoSum2([4, 15, 3, 7, 2], 9))
=============================结果==============================
D:\Programs\Python\Python36\python.exe D:/练习/leecode/two_sum.py
{4: 0}
{4: 0, 15: 1}
{4: 0, 15: 1, 3: 2}
{4: 0, 15: 1, 3: 2, 7: 3}
[3, 4]
Process finished with exit code 0


最终,分析解法2的复杂度:


时间复杂度—— O(N),N 是列表中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。

空间复杂度—— O(N),其中 N 是数组中的元素数量。主要是哈希表的开销,在空间上的消耗。


其实也不能说解法1就是最烂的,因为算法没有最好的算法,只有最适合的算法。

随着需求在空间和时间的取舍的不同,具体决定使用哪种算法也是不同的。

相关文章
|
21天前
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
33 7
|
21天前
|
算法 数据挖掘 数据安全/隐私保护
基于CS模型和CV模型的多目标协同滤波跟踪算法matlab仿真
本项目基于CS模型和CV模型的多目标协同滤波跟踪算法,旨在提高复杂场景下多个移动目标的跟踪精度和鲁棒性。通过融合目标间的关系和数据关联性,优化跟踪结果。程序在MATLAB2022A上运行,展示了真实轨迹与滤波轨迹的对比、位置及速度误差均值和均方误差等关键指标。核心代码包括对目标轨迹、速度及误差的详细绘图分析,验证了算法的有效性。该算法结合CS模型的初步聚类和CV模型的投票机制,增强了目标状态估计的准确性,尤其适用于遮挡、重叠和快速运动等复杂场景。
|
5月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
97 3
|
25天前
|
算法 数据安全/隐私保护 索引
基于GWO灰狼优化的多目标优化算法matlab仿真
本程序基于灰狼优化(GWO)算法实现多目标优化,适用于2个目标函数的MATLAB仿真。使用MATLAB2022A版本运行,迭代1000次后无水印输出结果。GWO通过模拟灰狼的社会层级和狩猎行为,有效搜索解空间,找到帕累托最优解集。核心步骤包括初始化狼群、更新领导者位置及适应值计算,确保高效探索多目标优化问题。该方法适用于工程、经济等领域复杂决策问题。
|
1月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
80 23
|
5月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
67 0
|
5月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
96 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
5月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
103 4
|
5月前
|
机器学习/深度学习 人工智能 算法
【MM2024】面向 StableDiffusion 的多目标图像编辑算法 VICTORIA
阿里云人工智能平台 PAI 团队与华南理工大学合作在国际多媒体顶级会议 ACM MM2024 上发表 VICTORIA 算法,这是一种面向 StableDiffusion 的多目标图像编辑算法。VICTORIA 通过文本依存关系来修正图像编辑过程中的交叉注意力图,从而确保关系对象的一致性,支持用户通过修改描述性提示一次性编辑多个目标。
|
5月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
64 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列