博客
关于我
【力扣算法16】之 18. 四数之和 python
阅读量:584 次
发布时间:2019-03-10

本文共 2020 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找到一个数组中满足特定条件的四元组。四元组中的四个数必须来自不同的位置,并且它们的和等于给定的目标值。同时,这些四元组不能重复。

方法思路

为了高效地解决这个问题,我们可以使用双指针法。具体步骤如下:

  • 排序数组:对数组进行排序,这样可以方便后续的去重和判断。
  • 去重处理:在遍历时,避免重复的元素组合。例如,在生成四元组时,使用集合存储这些四元组的值,避免重复。
  • 双指针搜索:对于每一对可能的第一个和第二个元素的位置,使用双指针来寻找剩下的两个元素,使得四个数的和等于目标值。
  • 具体实现步骤如下:

  • 如果数组长度小于4,直接返回空列表,因为无法找到四个数的组合。
  • 对数组进行排序。
  • 初始化结果列表为空。
  • 外层循环遍历数组中的每一个可能作为第一个元素的位置a。
  • 对a进行去重处理:如果当前元素与前一个元素相同,跳过。
  • 内层循环遍历数组中的每一个可能作为第二个元素的位置b(b > a)。
  • 对b进行去重处理:如果当前元素与前一个元素相同,跳过。
  • 初始化左指针为b+1,右指针为数组末尾。
  • 进入双指针循环:不断移动左右指针以搜索四个数的组合。
  • 计算当前四个数的和。
  • 如果和等于目标,添加四元组到结果,并进行去重处理。
  • 根据和与目标的关系,调整指针的位置。
  • 返回结果列表。
  • 解决代码

    class Solution:
    def fourSum(self, nums, target):
    n = len(nums)
    if n < 4:
    return []
    nums.sort()
    result = set() # 使用集合存储四元组,避免重复
    for a in range(n - 3):
    if a > 0 and nums[a] == nums[a - 1]:
    continue
    for b in range(a + 1, n - 2):
    if b > a + 1 and nums[b] == nums[b - 1]:
    continue
    left = b + 1
    right = n - 1
    while left < right:
    current_sum = nums[a] + nums[b] + nums[left] + nums[right]
    if current_sum == target:
    quad = (nums[a], nums[b], nums[left], nums[right])
    if quad not in result:
    result.add(quad)
    # 去重处理,避免相邻重复元素
    while left < right and nums[left] == nums[left + 1]:
    left += 1
    while left < right and nums[right] == nums[right - 1]:
    right -= 1
    elif current_sum < target:
    left += 1
    else:
    right -= 1
    return [list(quad) for quad in result]

    代码解释

  • 排序数组:对数组进行排序,以便后续的双指针搜索。
  • 去重处理:在生成四元组时,使用集合来存储这些四元组的值,避免重复。
  • 双指针搜索:对于每一对可能的第一个和第二个元素的位置,使用双指针来寻找剩下的两个元素,使得四个数的和等于目标值。根据当前和与目标的关系,调整指针的位置,直到满足条件或结束搜索。
  • 这种方法确保了我们能够高效地找到所有满足条件的四元组,并且避免了重复的元素组合。

    转载地址:http://nsjvz.baihongyu.com/

    你可能感兴趣的文章
    ndarray 比 recarray 访问快吗?
    查看>>
    ndk-cmake
    查看>>
    NdkBootPicker 使用与安装指南
    查看>>
    ndk特定版本下载
    查看>>
    NDK编译错误expected specifier-qualifier-list before...
    查看>>
    Neat Stuff to Do in List Controls Using Custom Draw
    查看>>
    Necurs僵尸网络攻击美国金融机构 利用Trickbot银行木马窃取账户信息和欺诈
    查看>>
    Needle in a haystack: efficient storage of billions of photos 【转】
    查看>>
    NeHe OpenGL教程 07 纹理过滤、应用光照
    查看>>
    NeHe OpenGL教程 第四十四课:3D光晕
    查看>>
    Neighbor2Neighbor 开源项目教程
    查看>>
    neo4j图形数据库Java应用
    查看>>
    Neo4j图数据库_web页面关闭登录实现免登陆访问_常用的cypher语句_删除_查询_创建关系图谱---Neo4j图数据库工作笔记0013
    查看>>
    Neo4j图数据库的介绍_图数据库结构_节点_关系_属性_数据---Neo4j图数据库工作笔记0001
    查看>>
    Neo4j图数据库的数据模型_包括节点_属性_数据_关系---Neo4j图数据库工作笔记0002
    查看>>
    Neo4j安装部署及使用
    查看>>
    Neo4j电影关系图Cypher
    查看>>
    Neo4j的安装与使用
    查看>>
    Neo4j(1):图数据库Neo4j介绍
    查看>>
    Neo4j(2):环境搭建
    查看>>