博客
关于我
【力扣算法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执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
    查看>>
    Mysql执行update by id的过程
    查看>>
    mysql执行计划
    查看>>
    MySQL执行计划 EXPLAIN参数
    查看>>
    MySQL执行计划【explain】,看这一篇就够啦!
    查看>>
    Mysql执行计划字段解释
    查看>>
    mysql执行计划怎么看
    查看>>
    MySQL执行计划解读
    查看>>
    mysql执行顺序与索引算法
    查看>>
    mysql批量update优化_Mysql中,21个写SQL的好习惯,你值得拥有呀
    查看>>
    mysql批量update操作时出现锁表
    查看>>
    MYSQL批量UPDATE的两种方式
    查看>>
    mysql批量修改字段名(列名)
    查看>>
    MySQL批量插入数据遇到错误1213的解决方法
    查看>>
    mysql技能梳理
    查看>>
    MySQL报Got an error reading communication packets错
    查看>>
    Mysql报错Can‘t create/write to file ‘/tmp/#sql_3a8_0.MYD‘ (Errcode: 28 - No space left on device)
    查看>>
    MySql报错Deadlock found when trying to get lock; try restarting transaction 的问题解决
    查看>>
    MySQL报错ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘
    查看>>
    Mysql报错Packet for query is too large问题解决
    查看>>