【LeetCode-中等题】18. 四数之和

news2024/11/18 19:42:55

文章目录

    • 题目
    • 方法一:双指针(定2动2)

题目

在这里插入图片描述

方法一:双指针(定2动2)

这题可以参考【LeetCode-中等题】15. 三数之和
区别在于,三数之和只需要用一个for循环定住一个数,然后设置两个前后指针来根据sum的值和目标值比较来滑动指针

那么这题也是同理的,我们需要做的事就是定住2个数,要用两个for循环定住两个数,然后设置两个前后指针来根据sum的值和目标值比较来滑动指针

里面的处理细节很多需要注意,提前处理一些不可能满足条件的情况,减少时间复杂度
在这里插入图片描述

class Solution {
//for定2 指针动2
    public List<List<Integer>> fourSum(int[] nums, int target) {
      int len =  nums.length;
      if(nums == null||len < 4 ) return new ArrayList<>();
      List<List<Integer>> res = new ArrayList<>();
      List<Integer> zres = null;
      Arrays.sort(nums);
      for(int i = 0 ;i< len-3 ;i++){
           //本身就是排序的数组  若第一个数就大于等于target了那么再加上任何一个数都会大于target,所以直接break
        //    if(nums[i]>target)  break;
        //这个条件不能要(对比LeetCode 15. 三数之和)  如果target是负数,第一个数大于target  在往下加可能会越来越小也是可以=taget的
                                     //但是如果target为0或正数,那么第一个数大于target  往下加会越来越大
          //去重操作  如果nums[i]==nums[i-1] 会得到一份与nums[i-1]一样的结果集
          if(i>0&&nums[i]==nums[i-1]) continue;
           // 若以i开头的四个元素就已经大于target了 那就无需做任何操作了,没必要了,在往后面加再怎么也会大于target
          if((long)nums[i]+nums[i+1]+nums[i+2]+nums[i+3] > target) break;
          // 若以i开头元素和数组末尾的三个元素就还小于target了 那就没必要做此次循环,毕竟i加上后面最大的三个数都比target小
          if((long)nums[i]+nums[len-1]+nums[len-2]+nums[len-3] < target) continue;
          for(int j = i+1 ;j< len-2 ;j++){//这里就和 LeetCode 15. 三数之和  一样的原理  唯一多了一个提前判断
              // 这里的三个if与上面同理  
               if(j>i+1&&nums[j]==nums[j-1]) continue;
               if((long)nums[i]+nums[j]+nums[j+1]+nums[j+2] > target) break;
               if((long)nums[i]+nums[j]+nums[len-1]+nums[len-2] < target) continue;
               int left = j+1;
               int right = len-1;
               while(left < right){
                   long sum =(long) nums[i]+nums[j]+nums[left]+nums[right];
                   if(sum == target) {
                       zres = new ArrayList<>();//满足要求的子结果集
                       zres.add(nums[i]);
                       zres.add(nums[j]);
                       zres.add(nums[left]);
                       zres.add(nums[right]);
                       res.add(zres);//加入大结果集
                       while(left < right &&nums[left]==nums[left+1]) left++;//两个指针的去重
                       while(left < right &&nums[right]==nums[right-1]) right--;
                       left++;//移动指针到不重复的新区域
                       right--;
                   }else if(sum >target)  right--;//缩小数值
                    else left++;//扩大数值
               }
          }
      }
      return res;
    }
}

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

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

相关文章

类和对象(3)

文章目录 1.回顾上节2. 拷贝构造3. 运算符重载&#xff08;非常重要&#xff09;4. 赋值运算符重载 1.回顾上节 默认成员函数&#xff1a;我们不写&#xff0c;编译器自动生成。我们不写&#xff0c;编译器不会自动生成 默认生成构造和析构&#xff1a; 对于内置类型不做处理对…

mysql远程连接失败

先上结论&#xff0c;只提出最容易忽略的地方 服务器是阿里云、腾讯云等平台&#xff0c;平台本身自带的防火墙没有开启iptables规则中禁用了3306&#xff0c;即使你根本没有启用iptables服务 第二条是最离谱的 从这里可以看到&#xff0c;我服务器并未启用 iptables 服务 但…

应用在电子体温计中的国产温度传感芯片

电子体温计由温度传感芯片&#xff0c;液晶显示器&#xff0c;纽扣电池&#xff0c;专用集成电路及其他电子元器件组成。能快速准确地测量人体体温&#xff0c;与传统的水银玻璃体温计相比&#xff0c;具有读数方便&#xff0c;测量时间短&#xff0c;测量精度高&#xff0c;能…

如何分析Apple搜索广告效果

Apple搜索广告提供了一系列指标&#xff0c;报告和功能&#xff0c;可为广告效果、用户行为和关键词有效性提供有价值的见解。通过利用此工具&#xff0c;广告商可以更深入地了解他们的广告活动&#xff0c;优化他们的策略&#xff0c;并取得更好的结果。 1、在研究数据之前&a…

深入解析NLP情感分析技术:从篇章到属性

目录 1. 情感分析概述1.1 什么是情感分析&#xff1f;- 情感分析的定义- 情感分析的应用领域 1.2 为什么情感分析如此重要&#xff1f;- 企业和研究的应用- 社交媒体和公共意见的影响 2. 篇章级情感分析2.1 技术概览- 文本分类的基本概念- 机器学习与深度学习方法- 词嵌入的力量…

webStorm内存溢出问题

手动启动vue项目正常运行&#xff0c;修改部分内容保存后会自动重新run一下&#xff0c; 这个时候就报错内存溢出&#xff0c;然后很悲伤的需要再手动重启一下。 每个人的情况不同&#xff0c;下面几种方法可以都试一试。 1、修改help里的内存配置 &#xff08;图片只参考修改…

puttygen工具ppk文件版本配置

有时一些程序要用到ppk密钥文件&#xff0c;如果用puttygen去生成的话&#xff0c;ppk文件版本是可以配置的&#xff0c;有版本2、版本3&#xff0c;如果出现密钥文件无效&#xff0c;可以试一下选择不用的文件版本。 配置位置&#xff1a;打开puttygen-选择菜单栏Key-选择Para…

差分+差分矩阵(更适合新手宝宝体质)

快速掌握差分以及差分矩阵 文章目录 快速掌握差分以及差分矩阵前言差分差分的定义【官方解释】差分自定义【跟前缀和放在一起理解】差分数组的应用 题目描述差分矩阵【与前缀和矩阵进行比较】差分矩阵定义【官方解释】自定义修改操作【跟前缀和对比】 题目描述代码 前言 之前我…

微信小程序——小程序的API介绍

小程序的宿主环境-API 1.小程序API概述 小程序中的API是由宿主环境提供的&#xff0c;通过这些丰富的小程序API&#xff0c;开发者可以方便的调用微信提供的能力&#xff0c;例如&#xff1a;获取用户信息&#xff0c;本地存储&#xff0c;支付功能等。 2.小程序API的3大分类…

wav文件碎片多删除后恢复案例

wav是微软针对音频提供的一种文件&#xff0c;其本质上和qt类文件&#xff08;如mp4 mov&#xff09;是一样的&#xff0c;都是“容器”类文件。但凡是容器类的文件其关注的点就是制定规则&#xff0c;一切按规则来&#xff08;wav中就是速率、时长、编码类型等&#xff09;。这…

Linux下利用文件IO函数完成多进程复制图片,父进程复制前一半,子进程复制后一半

Linux下利用文件IO函数完成多进程复制图片&#xff0c;父进程复制前一半&#xff0c;子进程复制后一半 一 、概述 在Linux环境下&#xff0c;利用多进程完成图片的复制操作本demo用到了两个进程&#xff0c;一个是主函数所在的父进程&#xff0c;一个在主函数里面创建的子进程…

安装系统作为启动盘的U盘恢复原样

1、插U盘 2、winr——cmd&#xff0c;输入diskpart 3、此电脑——管理——磁盘管理——查看磁盘号&#xff1a;磁盘 1 4、输入&#xff1a;select disk 1——clean 5、磁盘管理——右击新建简单卷——下一步即可

u盘传输数据的时候拔出会怎么样?小心这些危害

U盘是我们日常生活和工作中常使用的一种便携式存储设备。然而&#xff0c;在使用U盘传输数据时&#xff0c;有时我们会不小心将它拔出&#xff0c;而这个看似微不足道的行为实际上可能会带来严重的后果。本文将向您介绍U盘在传输数据时突然拔出可能导致的各种危害&#xff0c;其…

如何恢复U盘里面的已经损坏的数据?

弹出使用驱动器之前&#xff0c;先将U盘格式化的信息框&#xff0c;是Windows系统针对某些特定类型的U盘或移动硬盘的一种常见处理方式。一般来说&#xff0c;如果U盘或移动硬盘出现某些故障或问题&#xff0c;Windows系统会建议用户将其格式化。 格式化是一种常规的操作&…

Kafka消费者组重平衡(二)

文章目录 概要重平衡通知机制消费组组状态消费端重平衡流程Broker端重平衡流程 概要 上一篇Kafka消费者组重平衡主要介绍了重平衡相关的概念&#xff0c;本篇主要梳理重平衡发生的流程。 为了更好地观察&#xff0c;数据准备如下&#xff1a; kafka版本&#xff1a;kafka_2.1…

9.12 C++作业

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半…

模拟信号电压或电流信号转变频器频率传感器信号隔离变送器0-5V/0-10V/0-20mA/4-20mA转0-5KHz/0-10KHz/1-5KHz

主要特性: 精度等级&#xff1a;0.1 级、0.2 级。产品出厂前已检验校正&#xff0c;用户可以直接使用输 入 &#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA 等输出信号&#xff1a;0-5KHz/0-10KHz/1-5KHz 等标准信号辅助电源&#xff1a;5V、9V、12V、15V 或 24V 直流单电…

OpenCV(四十三):Shi-Tomas角点检测

1.Shi-Tomas角点检测原理 Shi-Tomasi&#xff08;也称为Good Features to Track&#xff09;角点检测算法是一种改进的角点检测方法&#xff0c;它基于Harris角点检测算法&#xff0c;并针对一些不足进行了改进。 与Harris角点检测不同&#xff0c;Shi-Tomasi使用了更简化的角点…

PDF怎么合并?这几个方法收藏起来吧

PDF文件是一种非常常见的文档格式&#xff0c;它具有跨平台、易于阅读和打印等优点&#xff0c;因此在生活和工作中得到了广泛的应用。当我们需要将多个PDF文件合并成一个文件时&#xff0c;我们可以采用以下几种方法。 方法一&#xff1a;使用PDF转换工具 我们在电脑上打开迅…

Spring Boot 中的 @CacheEvict 注解使用

Spring Boot 中的 CacheEvict 注解 在 Spring Boot 中&#xff0c;缓存是提高应用性能的重要手段。为了更好地管理缓存&#xff0c;Spring Boot 提供了一系列的缓存注解&#xff0c;其中 CacheEvict 注解用于清空缓存。 本文将介绍 CacheEvict 注解的含义、原理以及如何使用。…