成都学校网站制作设计师网站登录入口
web/
2025/10/3 5:53:15/
文章来源:
成都学校网站制作,设计师网站登录入口,淮安网站建设哪家好,百度人工优化文章目录 四数之和题目描述示例 1示例 2提示解决方案1#xff1a;【四层遍历查找】解决方案2#xff1a;【哈希表】【三层遍历】 结束语 四数之和 四数之和
题目描述
给你一个由 n 个整数组成的数组 nums #xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件… 文章目录 四数之和题目描述示例 1示例 2提示解决方案1【四层遍历查找】解决方案2【哈希表】【三层遍历】 结束语 四数之和 四数之和
题目描述
给你一个由 n 个整数组成的数组 nums 和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] 若两个四元组元素一一对应则认为两个四元组重复
0 a, b, c, d n
a、b、c 和 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]]
提示
1 nums.length 200-109 nums[i] 109-109 target 109
解决方案1【四层遍历查找】
对于解决【四数之和】这个问题一种直观的解法是四层循环枚举所有可能的四元组然后判断它们的和是否为目标值target但是这样的时间复杂度是 O(n4)对于较大的数组来说是不可接受的。
解决方案2【哈希表】【三层遍历】
在探讨【四数之和】这一算法题之前我相信许多读者已经对【三数之和】有所涉猎。在【【LeetCode刷题笔记6-1】【Python】【三数之和】【哈希表】【中等】】中我详细介绍了如何设计基于【哈希表】的算法解决【三数之和】问题。
现在摆在我们面前的是【四数之和】问题它与【三数之和】在本质上是一样的。因此我们很自然地会把解决【三数之和】的算法搬过来在此基础上修改从而解决【四数之和】问题。
完整代码如下
class Solution:def fourSum(self, nums: List[int], target: int) - List[List[int]]:hash_map {}num_idx 0new_nums []for idx, num in enumerate(nums):if num not in hash_map:hash_map[num] [num_idx]new_nums.append(num)num_idx 1else:# 修改1原数组的任意元素都可以重复至多四次if len(hash_map[num]) 4: hash_map[num].append(num_idx)new_nums.append(num)num_idx 1else:passresult_list [] n len(new_nums)is_used_results set()# 修改2两层遍历改用三层遍历for i in range(n): for j in range(i1, n): for k in range(j1, n):if target -(new_nums[i] new_nums[j] new_nums[k]) in hash_map: for m in hash_map[target -(new_nums[i] new_nums[j] new_nums[k])]: if m i:continueelif m j:continue# 修改3在进行索引去重操作时多判断一次elif m k:continueelse:sorted_result tuple(sorted([new_nums[k], new_nums[i], new_nums[j], new_nums[m]]))if sorted_result in is_used_results: passelse:result_list.append([new_nums[k], new_nums[i], new_nums[j], new_nums[m]]) is_used_results.add(sorted_result) return result_list如果对上面代码的执行逻辑不太熟悉建议参考一下【【LeetCode刷题笔记6-1】【Python】【三数之和】【哈希表】【中等】】中的代码上面的代码和解决【三数之和】的代码绝大部分是一致的注释和算法逻辑也在【【LeetCode刷题笔记6-1】【Python】【三数之和】【哈希表】【中等】】叙述的非常清楚。
因此在这篇博客中我主要叙述一下修改细节。 与【三数之和】问题一样【四数之和】的原数组nums也会出现冗余的情况。但不一样的是【四数之和】允许原数组nums的元素重复至多四次因为存在num*4 target的情况而【三数之和】对于除0以外的任意元素至多重复两次。 基于这个认知我们需要修改【原数组去重部分的代码】使得原数组的任意元素都可以重复至多四次。修改之处在上面的代码已标明。 由于是【四数之和】因此需要从两层遍历改用三层遍历 由于是【四数之和】需要保证四个索引互不相同因此需要额外多进行一次去重操作。
运行结果
复杂度分析
时间复杂度O(N3)其中 N 是新数组new_nums元素的数量。 三层循环遍历新数组 O(N3) 空间复杂度O(N) 需要用哈希表和列表存放新数组 O(N)
结束语
亲爱的读者感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见因此在这里鼓励您对我们的博客进行评论。您的建议和看法对我们来说非常重要这有助于我们更好地了解您的需求并提供更高质量的内容和服务。无论您是喜欢我们的博客还是对其有任何疑问或建议我们都非常期待您的留言。让我们一起互动共同进步谢谢您的支持和参与我会坚持不懈地创作并持续优化博文质量为您提供更好的阅读体验。谢谢您的阅读
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86048.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!