LeetCode题解:18.四数之和【Python题解超详细】,三数之和 vs. 四数之和

news/2024/11/18 21:58:10/

题目描述

        给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

        你可以按 任意顺序 返回答案 。

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

解答

class Solution(object):def fourSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[List[int]]"""# 最终结果列表result = []# 如果输入列表为空或长度小于4,直接返回空列表if not nums or len(nums) < 4:return result# 对数组进行排序,以便使用双指针法nums.sort()n = len(nums)# 第一层循环:固定第一个数for i in range(n - 3):# 跳过重复元素,避免结果重复if i > 0 and nums[i] == nums[i - 1]:continue# 剪枝:当前最小的四个数和已经大于目标值,后续无需处理if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:break# 剪枝:当前最大的四个数和还小于目标值,直接跳过当前循环if nums[i] + nums[n - 3] + nums[n - 2] + nums[n - 1] < target:continue# 第二层循环:固定第二个数for j in range(i + 1, n - 2):# 跳过重复元素,避免结果重复if j > i + 1 and nums[j] == nums[j - 1]:continue# 剪枝:当前最小的四个数和已经大于目标值,后续无需处理if nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target:break# 剪枝:当前最大的四个数和还小于目标值,直接跳过当前循环if nums[i] + nums[j] + nums[n - 2] + nums[n - 1] < target:continue# 双指针寻找符合条件的剩余两个数left, right = j + 1, n - 1while left < right:# 当前四数之和s = nums[i] + nums[j] + nums[left] + nums[right]# 如果找到目标和if s == target:result.append([nums[i], nums[j], nums[left], nums[right]])# 跳过重复元素while left < right and nums[left] == nums[left + 1]:left += 1left += 1while left < right and nums[right] == nums[right - 1]:right -= 1right -= 1# 如果当前和小于目标值,移动左指针以增加和elif s < target:left += 1# 如果当前和大于目标值,移动右指针以减小和else:right -= 1# 返回结果return result

        思路,排序+双指针:该代码通过 **排序+双指针** 的思路解决四数之和问题。首先对数组排序,然后通过两层循环固定前两个数,并使用双指针在剩余部分寻找符合条件的另外两个数。通过剪枝优化(跳过不可能的情况)和去重操作(避免重复结果),提升效率并确保结果的唯一性。最终将所有符合条件的四元组返回。代码的时间复杂度为 O(n^3),适合中小规模的输入数据。

四数之和 vs. 三数之和

        这道题实际上是LeetCode15题:三数之和的拓展版,与使用 排序+双指针 求解三数之和相同的是两者都使用了 排序 + 双指针 的方法来寻找目标组合,即通过固定部分数字后,利用双指针在剩余数组中寻找满足条件的组合。同时,两者都是通过嵌套循环和双指针来解决问题,三数之和的时间复杂度为 O(n^2),四数之和则要多一层循环,其时间复杂度为 O(n^3)。并且,在去重逻辑上,两者都需要跳过重复元素以避免重复结果。此外,两者所采用的剪枝思路也是相同的。

        根据上述思路,你能想出计算五数之和的思路,并思考它的时间复杂度吗?

感谢阅读,希望对你有所帮助~


http://www.ppmy.cn/news/1548084.html

相关文章

【贪心算法】贪心算法三

贪心算法三 1.买卖股票的最佳时机2.买卖股票的最佳时机 II3.K 次取反后最大化的数组和4.按身高排序5.优势洗牌&#xff08;田忌赛马&#xff09; 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#…

android studio new flutter project-运行第一个flutter项目

android studio new flutter project win10系统&#xff0c;由于之前尝试学习RN的时候已经安装了android studio 所以在尝试运行Flutter项目省去了一些步骤 这里说一下如何在android studio创建第一个flutter project 下载flutter sdk 到 https://docs.flutter.cn/release/a…

.NET 9.0 中 System.Text.Json 的全面使用指南

以下是一些 System.Text.Json 在 .NET 9.0 中的使用方式&#xff0c;包括序列化、反序列化、配置选项等&#xff0c;并附上输出结果。 基本序列化和反序列化 using System; using System.Text.Json; public class Program {public class Person{public string Name { get; se…

HTTP常见的请求头有哪些?都有什么作用?在 Web 应用中使用这些请求头?

HTTP 请求头&#xff08;Request Headers&#xff09;用于在 HTTP 请求中携带额外的信息&#xff0c;帮助服务器更好地处理请求。以下是一些常见的 HTTP 请求头及其作用&#xff1a; 常见请求头及其作用 1. Accept 作用&#xff1a;告知服务器客户端可以接受的内容类型。示例…

网络技术-定义配置ACL规则的语法和命令

定义ACL&#xff08;访问控制列表&#xff09;规则时&#xff0c;具体命令会根据所使用的设备和操作系统而有所不同。以下是一些常见的设备和操作系统中定义ACL规则的命令示例&#xff1a; 一&#xff1a;思科&#xff08;Cisco&#xff09;路由器/交换机 在思科设备中&#…

微服务day07

MQ高级 发送者可靠性&#xff0c;MQ的可靠性&#xff0c;消费者可靠性。 发送者可靠性 发送者重连 连接重试的配置文件&#xff1a; spring:rabbitmq:connection-timeout: 1s # 设置MQ的连接超时时间template:retry:enabled: true # 开启超时重试机制initial-interval: 10…

机器学习—Additional Layer Types

到目前为止&#xff0c;我们使用的所有神经网络都是密集型的&#xff0c;一层中的每个神经元&#xff0c;上一层的所有激活&#xff0c;事实证明&#xff0c;仅仅使用密集层类型&#xff0c;可以建立一些非常强大的学习算法&#xff0c;并帮助你建立关于神经网络能做什么的进一…

css:修改盒子样式

圆角边框 在css3中新增了圆角边框样式&#xff0c;这样我们的盒子就可以长得奇形怪状了 像csdn上的发布就是圆角边框 还有这些 .x,.y {background-color: cornflowerblue;width: 200px;height: 200px;margin: 0 auto;text-align: center;border-radius: 10px;} 10px是什么意思…