18.四数之和

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

  • 0
  • a、b、c 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

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

解题思路:

最朴素的方法是使用四重循环枚举所有的四元组,然后使用哈希表进行去重操作,得到不包含重复四元组的最终答案。假设数组的长度是 nnn,则该方法中,枚举的时间复杂度为 O(n^4),去重操作的时间复杂度和空间复杂度也很高,因此需要换一种思路。

为了避免枚举到重复四元组,则需要保证每一重循环枚举到的元素不小于其上一重循环枚举到的元素,且在同一重循环中不能多次枚举到相同的元素。

为了实现上述要求,可以对数组进行排序,并且在循环过程中遵循以下两点:

每一种循环枚举到的下标必须大于上一重循环枚举到的下标;

同一重循环中,如果当前元素与上一个元素相同,则跳过当前元素。

使用上述方法,可以避免枚举到重复四元组,但是由于仍使用四重循环,时间复杂度仍是 O(n^4)。注意到数组已经被排序,因此可以使用双指针的方法去掉一重循环。

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {// 两数之和// 排序 + 双指针// 或者 使用哈希表// 三数之和// 排序 + 遍历确定第一个数字 + 双指针// 四数之和// 排序 + 遍历确定前两个数字 + 双指针// a,b,c,d 四个数字需要互不相同// 且四元组不能重复int n = nums.length;Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<>();for(int a = 0;a < n - 3;a ++) {// 确定 a// 如果 nums[a] == nums[a-1] 则跳过// 因为这时对于 nums[a] 满足的 b,c,d// 对于 nums[a-1] 也一定满足 if(a > 0 && nums[a] == nums[a-1]) {continue;}if(0L + nums[a] + nums[a+1] + nums[a+2] + nums[a+3] > target) {// 如果当前 a 对应最小的四元组之和都大于 target// 那么当前 a 对应的四元组都不满足需求// 并且 a 往右遍历, nums[a] 是增大的// 那么以后的 a 更不满足需求, 可以提前结束了return ans;}else if(0L + nums[a] + nums[n-1] + nums[n-2] + nums[n-3] < target) {// 如果当前 a 最大的四元组都小于 target// 那么当前 a 对应的四元组都不满足需求// 之后遍历的 a ,nums[a] 会变大 有可能满足需求// 因此跳过当前轮次continue;}for(int b = a + 1; b < n - 2;b ++) {// 确定 bif(b > a+1 && nums[b] == nums[b-1]) {continue;}if(0L + nums[a] + nums[b] + nums[b+1] + nums[b+2] > target) {// 如果当前 b 对应的最小的大于 target// 那么当前 b 对应的其它四元组也必定大于 target// 而且 a 不变的情况下 b 往右遍历 只会得到更大的四元组// 对于下一个 a , b 会变小 可能会满足需求// 因此需要跳过当前 a break;} else if(0L + nums[a] + nums[b] + nums[n-1] + nums[n-2] < target) {// 如果当前 b 对应最大的四元组小于 target// 当前 b 对应的其它四元组也是小于 target// 而下一个 b 会增大,有可能满足需求continue;}int c = b + 1, d = n - 1;long sumAB = nums[a] + nums[b];while(c < d) {if(sumAB + nums[c] + nums[d] == target) {// 加入答案ans.add(Arrays.asList(nums[a],nums[b],nums[c],nums[d]));c ++;while(c < d && nums[c] == nums[c-1]) {// 过滤掉重复的 c// 因为 nums[a] nums[b] 已经确定// nums[c] 如果再相同,// 就会产生重复的四元组c ++;}d --;while(c < d && nums[d] == nums[d + 1]) {// 过滤掉重复的 dd --;}} else if(sumAB + nums[c] + nums[d] < target) {c ++;} else {d --;}}}}return ans;}
}

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

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

相关文章

(力扣题库)字符串相乘(C++)

题意如下&#xff1a; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2"…

每日一题 — 有效三角形的个数

611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 双指针思想&#xff0c;先将数据排序 然后先固定最大的数Max&#xff0c;也就是数组最后的数再定义一左一右两个下标 left 、 right&#xff0c;当这个值相加大于最大的数&#xff0c;那么他两…

Pytorch学习 day05(RandomCrop、Transforms工具使用总结)

RandomCrop 将PIL或Tensor格式的输入图片&#xff0c;随机裁剪指定尺寸的部分输入尺寸可以为序列或单个整形数字代码如下&#xff1a; from PIL import Image from torchvision import transforms from torch.utils.tensorboard import SummaryWriterimg Image.open("i…

token的无感刷新

Token的无感刷新通常通过以下步骤实现&#xff1a; 用户登录时&#xff0c;服务器生成一个访问令牌&#xff08;Access Token&#xff09;和一个刷新令牌&#xff08;Refresh Token&#xff09;&#xff0c;并将其返回给客户端。 客户端在每个请求中携带访问令牌&#xff0c;以…

百度换肤js

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>05 图片切换</title><style type"text/css">*{padding: 0;margin: 0;}#box{border: 1px solid #ccc;width: 430px;height: 70px…

python高级之元类

python高级之元类 一、Type创建类1、传统方式创建类2、非传统方式 二、元类三、总结 一、Type创建类 class A(object):def __init__(self, name):self.name namedef __new__(cls, *args, **kwargs):data object.__new__(cls)return data根据类创建对象 objA(‘kobe’) 1、执…

C++ 最短路 堆优化版的Dijkstra算法

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为非负值。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;则输出 −1 。 输入格式 第一行包含整数 n 和 m 。 接下来 m 行每行包含三个…

外包干了2年,技术退步明显

先说一下自己的情况&#xff0c;研究生&#xff0c;19年进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

18个惊艳的可视化大屏(第18辑):数字资产场景

hello&#xff0c;我是贝格前端工场&#xff0c;本次分享可视化大屏在数字资产领域的应用&#xff0c;喜欢文章的别忘点赞关注&#xff0c;文章底部也有其他行业的案例&#xff0c;有需求您说话&#xff08;可私信&#xff09;。 数字资产可视化大屏可以应用于各种场景&#x…

Vue.js+SpringBoot开发森林火灾预警系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟雾传感器模块2.4 温度传感器模块2.5 历史记录模块2.6 园区数据模块 三、系统设计3.1 用例设计3.1.1 森林园区基础系统用例设计3.1.2 森林预警数据用例设计 3.2 数据库设计3.2.1 烟雾…

GO语言学习笔记(与Java的比较学习)(六)

包 标准库概述 像 fmt、os 等这样具有常用功能的内置包在 Go 语言中有 150 个以上&#xff0c;它们被称为标准库&#xff0c;大部分 (一些底层的除外) 内置于 Go 本身。 正则表达式使用&#xff1a; 以下是一些常见的正则表达式语法和元字符&#xff1a; 普通字符&#xff…

每日shell脚本之自动化备份管理镜像

每日shell脚本之自动化备份管理镜像 #!/bin/bash h_sl(){echo "-------------------" } save(){if [ ! -d "./images" ]; thenmkdir imagesficd imagesdocker images --format "{{.ID}} {{.Repository}}:{{.Tag}} {{.Size}}" > images_pull.…

Vue后台管理系统笔记-01

npm&#xff08;Node Package Manager&#xff09;和 yarn 是两个常用的包管理工具&#xff0c;用于在 Node.js 项目中安装、管理和更新依赖项。它们有以下几个区别&#xff1a; 性能和速度&#xff1a;在包的安装和下载方面&#xff0c;yarn 通常比 npm 更快速。yarn 使用了并…

代码随想录算法训练营Day38 || leetCode 7509. 斐波那契数 || 70. 爬楼梯 || 746. 使用最小花费爬楼梯

动态规划和我们数电中学习的时序电路类似&#xff0c;某一时刻的状态不仅与当前时刻的输入有关&#xff0c;还与之前的状态有关&#xff0c;所以推导过程中我们需要模拟题目中的情况&#xff0c;来找到每一时刻状态间的关系。 做题思路如下 509. 斐波那契数 此题简单 状态方程…

【官宣】2024广州国际酒店工程家具及商业空间展览会

2024广州国际酒店工程家具及商业空间展览会 Guangzhou International Hotel Engineering Furniture and commercial space exhibition 2024 时间&#xff1a;2024年12月19-21日 地点&#xff1a;中国进出口商品交易会展馆 承办单位&#xff1a;广州佛兴英耀展览服务有…

【计算机网络】IO多路转接之epoll

文章目录 一、epoll的相关系统调用二、epoll工作原理三、epoll的优点(和 select 的缺点对应)四、epoll工作方式五、epoll服务器1.Sock.hpp2.Log.hpp3.Err.hpp4.epollServer.hpp5.epollServer.cc 一、epoll的相关系统调用 按照man手册的说法: 是为处理大批量句柄而作了改进的po…

Java精品项目--第7期基于SpringBoot的驾校后台管理系统的设计分析与实现

项目使用技术栈 JavaSpringBootMavenMySQLMyBatisShiroHTMLVue.js&#xff08;非前后端分离&#xff09;… 项目截图

IOS使用Unity容器动态加载3D模型

项目背景 我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互。而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案。 对于Unity容器来说,需要满足如下的功能: 1.在APP启动时,需要满足动态下载最…

leetcode 热题 100_滑动窗口最大值

题解一&#xff1a; 双端队列&#xff1a;滑动窗口的本质是在窗口末尾添加一个元素&#xff0c;并移除头部的一个元素。对于添加的元素&#xff0c;直接和当前最大值比较即可&#xff0c;但对于移除的元素&#xff0c;如果移除的是原先的最大值&#xff0c;则需要重新遍历窗口寻…

MySQL面试题-基础内容(答案版)

基础内容 1、MySQL的架构分层 &#xff08;1&#xff09;Serve层&#xff1a;负责建立连接、分析和执行 SQL。 MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包括连接器&#xff0c;查询缓存、解析器、预处理器、优化器、执行器等。另外&#xff0c;所有的内置函数&…