【LeetCode刷题笔记(7-1)】【Python】【四数之和】【哈希表】【中等】

文章目录

  • 四数之和
    • 题目描述
    • 示例 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(i+1, n):  for k in range(j+1, 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】【三数之和】【哈希表】【中等】】叙述的非常清楚。

因此,在这篇博客中,我主要叙述一下修改细节。

  1. 与【三数之和】问题一样,【四数之和】的原数组nums也会出现冗余的情况。但不一样的是,【四数之和】允许原数组nums的元素重复至多四次,因为存在num*4 = target的情况,而【三数之和】对于除0以外的任意元素,至多重复两次。
    基于这个认知,我们需要修改【原数组去重部分的代码】,使得原数组的任意元素都可以重复至多四次。修改之处在上面的代码已标明。

  2. 由于是【四数之和】,因此需要从两层遍历改用三层遍历;

  3. 由于是【四数之和】,需要保证四个索引互不相同,因此需要额外多进行一次去重操作。

运行结果
在这里插入图片描述

复杂度分析

  • 时间复杂度:O(N3),其中 N 是新数组new_nums元素的数量。
    • 三层循环遍历新数组 ===> O(N3)
  • 空间复杂度:O(N)
    • 需要用哈希表列表存放新数组 ===> O(N)

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/278044.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Logistic 回归算法

Logistic 回归 Logistic 回归算法Logistic 回归简述Sigmoid 函数Logistic 回归模型表达式求解参数 $\theta $梯度上升优化算法 Logistic 回归简单实现使用 sklearn 构建 Logistic 回归分类器Logistic 回归算法的优缺点 Logistic 回归算法 Logistic 回归简述 Logistic 回归是一…

uniapp播放 m3u8格式视频 兼容pc和移动端

支持全自动播放、设置参数 自己摸索出来的,花了一天时间,给点订阅支持下,订阅后,不懂的地方可以私聊我。 代码实现 代码实现 1.安装dplayer组件 npm i dplayer2. static/index.html下引入 hls 引入hls.min.js 可以存放在static项目hls下面<script src="/static…

error: src refspec master does not match any

新项目 push 至 github 仓库的时候抛出了如下异常 error: src refspec master does not match any 解决办法 首先,查看当前 branch, 因新项目只有一个 main git branch早期都是 master 而不是 main,所以将现有的改成 main 或者 master 均可 git branch -m main // 或者 git…

scipy.signal.hilbert和scipy.fftpack.hilbert的区别

提示&#xff1a;分析scipy.signal.hilbert和scipy.fftpack.hilbert在应用的区别 一、代码 import matplotlib import matplotlib.pyplot as plt import numpy as np from pyhht import EMD from scipy.signal import hilbert import tftb.processing from scipy import signa…

26种主流的神经网络偏微分方程求解方法汇总

偏微分方程&#xff08;PDE&#xff09;是数学中一门重要的分支&#xff0c;应用范围广泛涉及自然科学、工程技术、生物学领域等。然而我们都知道&#xff0c;偏微分方程的求解过程异常艰难&#xff0c;如果碰上了特别复杂的&#xff0c;传统的计算方法可能需要数百万个CPU小时…

网站服务器/域名/备案到底有什么关联?

​  在一个网站的组成中&#xff0c;网站服务器、域名、备案这几个要素是要被常提到的。在谈及三者关联之前&#xff0c;我们先了解下三者的各自概念。 域名&#xff1a;它是网站的唯一标识符&#xff0c;通俗理解来说就是用户在浏览器地址栏中输入的网址。一般来说&#xff…

自动驾驶技术:驶向未来的智能之路

导言 自动驾驶技术正引领着汽车产业向着更安全、高效、智能的未来演进。本文将深入研究自动驾驶技术的核心原理、关键技术、应用场景以及对交通、社会的深远影响。 1. 简介 自动驾驶技术是基于先进传感器、计算机视觉、机器学习等技术的创新&#xff0c;旨在实现汽车在不需要人…

DICOM 文件中,VR,VL,SQ,图像二进制的几个注意点

DICOM 文件的结构&#xff0c;在网上有很多的学习资料&#xff0c;这里只介绍些容易混淆的概念&#xff0c;作为回看笔记。 1. 传输语法 每个传输语法&#xff0c;起都是表达的三个概念&#xff1a;大小端、显隐式、压缩算法 DICOM Implicit VR Little Endian: 1.2.840.1000…

CSS基础面试题

介绍一下标准css盒子模型与低版本IE的盒子模型&#xff1f; 标准盒子模型&#xff1a;宽度内容的宽度&#xff08;content&#xff09; border padding margin 低版本IE盒子模型&#xff1a;宽度内容宽度&#xff08;contentborderpadding&#xff09; margin box-sizing 属性…

JOSEF 组合中间继电器 RXMM1-RK214003 DC220V 不带底座

系列型号 RXMM1 RK 214 002组合中间继电器&#xff1b;RXMM1 RK 214 003组合中间继电器; RXMM1 RK 214 004组合中间继电器&#xff1b;RXMM1 RK 214 005组合中间继电器; RXMM1 RK 214 006组合中间继电器&#xff1b; 1 用途 RXMM1系列组合中间继电器用于电力系统二次回路及…

01-EEA电子电器架构

1.背景 汽车正在从传统的机械装置逐步电气化&#xff0c;汽车电子电气功能不断的丰富。越来越多的电气系统和功能被集成到汽车上&#xff0c;传统的原理及线束设计已经远远不能满足。为此&#xff0c;EEA(电子电气架构)应运而生。如何设计电子电气架构&#xff0c;满足日益增长…

Linux系统中如何开启和配置OpenGauss数据库的远程连接

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试7. 结语 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍…