博客
关于我
【力扣算法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/

    你可能感兴趣的文章
    Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
    查看>>
    mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
    查看>>
    mysqldump 参数--lock-tables浅析
    查看>>
    mysqldump 导出中文乱码
    查看>>
    mysqldump 导出数据库中每张表的前n条
    查看>>
    mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
    查看>>
    Mysqldump参数大全(参数来源于mysql5.5.19源码)
    查看>>
    mysqldump备份时忽略某些表
    查看>>
    mysqldump实现数据备份及灾难恢复
    查看>>
    mysqldump数据库备份无法进行操作只能查询 --single-transaction
    查看>>
    mysqldump的一些用法
    查看>>
    mysqli
    查看>>
    MySQLIntegrityConstraintViolationException异常处理
    查看>>
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>