代码随想录算法训练营第十二天|第18题. 四数之和

news2025/1/15 19:00:29

文档讲解:代码随想录

难度:有一点点难度

附:寒假继续开始刷题更新刷题记录

passion!!!passion!!!passion!!!

第18题. 四数之和

力扣题目链接(opens new window)

题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]

思路

可以将问题简单化:往期刷过两数之和和三数之和,所以可以尝试将四数之和转换为三数之和,三数之和的解题的一个巧妙思路如下:

为了降低时间复杂程度,可以对一些可以直接排除的元素进行去除:三数之和中如果一个数字大于目标数字,则可以直接去除(由于已知目标是0,故第一个数字不可以大于目标数字)

详细参考以下文档:

代码随想录

第15题. 三数之和

也可以参考本人往期作品中的“三数之和”

代码随想录算法训练营第十一天|383. 赎金信, 15. 三数之和

  1.  由于题目并没有表明该数组是有序k数组,故应先对数组进行排序(sort方法);
  2. 进入循环1.1(k)
  3. 同理,对一些元素直接排除:因为目标的大小正负未知,故应该加一些条件:如果一个数字大于目标,但为了避免出现特殊情况(如num[k]=-4,目标是-10,)应该对该数字和目标进行正负分析并添加验证条件,可以判断   目标数字或num[k]的正负, 最后为代码实现为nums[i] > target && (nums[i] >=0 || target >= 0)
  4. 去除相同的数字(题目要求),因为已经进行了排序,故判断该数字的前(后)即可
  5. 进入循环2.1(i)(2代表为内层,.1代表是内层第一次循环,以下同理)
  6. 进行第二次进入步骤2,3(可以理解为将前两个数字和并为一个整体后,再进行一次判断)
  7. 设置左右指针,左指针为i的下一个元素,右指针为num数组的最后一个元素
  8. 进入循环3.1(判断条件为右指针应该大于左指针)
  9. 求四数之和:sum=num[k]+num[i]+num[left]+num[right],如果sum偏大则将右指针左移动(排序后,右侧数大于左侧),如果sum偏小则将左指针右移动,如果符合则将num[k],num[i],num[left],num[right]计入result数组
  10. 进入循环4.1,4.2再次进行步骤4进行去重
  11. 左右指针都向中移动
  12. 所有循环结束返回result数组
  13. 定义测试部分:

补充

 在Java中,foreach循环也被称为增强型for循环。它可以用来遍历数组、集合或其他类似结构的数据。foreach循环的语法如下:

  for (element_type element : collection) {

  // 循环体

  }

  其中,element_type是集合中元素的类型,element是集合中每个元素的变量名,collection是需要遍历的集合。在循环体中,可以使用element变量来访问当前元素的值。

  下面是一个示例,展示了如何使用foreach循环来遍历一个整型数组:

  int[] numbers = {1, 2, 3, 4, 5};

  for (int number : numbers) {

  System.out.println(number);

  }

  在这个示例中,我们定义了一个整型数组numbers,然后使用foreach循环来遍历这个数组,并在循环体中打印出每个元素的值。输出结果如下:

  除了数组,foreach循环还可以用于遍历其他类型的集合,例如List、Set、Map等。不过需要注意的是,对于Map类型的集合,foreach循环只能遍历其中的键或值,而不能同时访问键和值。

代码如下: 

import java.util.*;

public class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);  // 排序数组
        List<List<Integer>> result = new ArrayList<>();  // 放结果
        for (int k = 0; k < nums.length; k++) {
            // 剪枝处理
            if (nums[k] > target && nums[k] >= 0) {
                break;
            }
            // 去除nums[k]相同的元素
            if (k > 0 && nums[k] == nums[k - 1]) {
                continue;
            }
            for (int i = k + 1; i < nums.length; i++) {
                // 第二级剪枝
                if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {
                    break;
                }
                // 去除nums[i]相同的元素
                if (i > k + 1 && nums[i] == nums[i - 1]) {
                    continue;
                }
                int left = i + 1;
                int right = nums.length - 1;
                while (right > left) {
                    long sum = (long) nums[k] + nums[i] + nums[left] + nums[right];
                    if (sum > target) {
                        right--;
                    } else if (sum < target) {
                        left++;
                    } else {
                        result.add(Arrays.asList(nums[k], nums[i], nums[left], nums[right]));
                        // 对nums[left]和nums[right]去重
                        while (right > left && nums[right] == nums[right - 1]) right--;
                        while (right > left && nums[left] == nums[left + 1]) left++;
                        right--;
                        left++;
                    }
                }
            }
        }
        return result;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums = {1, 0, -1, 0, -2, 2};
        int target = 0;
        List<List<Integer>> results = solution.fourSum(nums, target);
        for (List<Integer> result : results) {
            System.out.println(result);
        }
    }
}

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

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

相关文章

浅谈云计算12 | KVM虚拟化技术

KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具&#xff08;QEMU、Libvirt等&#xff09; 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…

unity如何在urp管线下合并spine的渲染批次

对于导入unity的spine来说,他会对每个spine生成独有的材质,虽然他们使用的是同一个shader,但由于附带独有的贴图,这样在项目使用中会由于材质贴图不同而导致无法合批. 而为什么选用urp,因为在built-in管线中,对于GPU-instancing,即使通过使用图集的方式统一了贴图,也会由于spi…

list的迭代器模拟实现和迭代器失效(续)

文章目录 list的迭代器operator->普通迭代器和const迭代器迭代器模版迭代器失效析构拷贝构造赋值重载 initializer_list list的迭代器 对迭代器进行封装&#xff0c;迭代器的指针还是4个字节&#xff0c;在物理上是一样的&#xff0c;但是底层是完全不同的 迭代器是浅拷贝&a…

一文通透OpenVLA及其源码剖析——基于Prismatic VLM(SigLIP、DinoV2、Llama 2)及离散化动作预测

前言 当对机器人动作策略的预测越来越成熟稳定之后(比如ACT、比如扩散策略diffusion policy)&#xff0c;为了让机器人可以拥有更好的泛化能力&#xff0c;比较典型的途径之一便是基于预训练过的大语言模型中的广泛知识&#xff0c;然后加一个policy head(当然&#xff0c;一开…

Easysearch Rollup 使用指南

背景 在现代数据驱动的世界中&#xff0c;时序数据的处理变得越来越重要。无论是监控系统、日志分析&#xff0c;还是物联网设备的数据收集&#xff0c;时序数据都占据了大量的存储空间。随着时间的推移&#xff0c;这些数据的存储成本和管理复杂度也在不断增加。 为了解决这…

FPGA EDA软件的位流验证

位流验证&#xff0c;对于芯片研发是一个非常重要的测试手段&#xff0c;对于纯软件开发人员&#xff0c;最难理解的就是位流验证。在FPGA芯片研发中&#xff0c;位流验证是在做什么&#xff0c;在哪些阶段需要做位流验证&#xff0c;如何做&#xff1f;都是问题。 我们先整体的…

[免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue新能源汽车充电桩管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue新能源汽车充电桩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息化时代的到来&#xff0…

如何选择多个视频文件

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何选择多个图片文件"相关的内容&#xff0c;本章回中将介绍如何选择视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在前…

闲谭SpringBoot--ShardingSphere分布式事务探究

文章目录 0. 背景1. 未分库分表时2. 仅分表时3. 分库分表时3.1 不涉及分库表3.2 涉及分库表&#xff0c;且分库表处于一个库3.3 涉及分库表&#xff0c;且分库表处于多个库3.4 涉及分库表&#xff0c;且运行中某库停机 4. 小结 0. 背景 接上篇文章《闲谭SpringBoot–ShardingS…

【20250113】基于肌肉形变测量的连续步态相位估计算法,可自适应步行速度和地形坡度...

【基本信息】 论文标题&#xff1a;Continuous Gait Phase Estimation by Muscle Deformations with Speed and Ramp Adaptability 发表期刊&#xff1a;IEEE Sensors Journal 发表时间&#xff1a;2024年5月30日 【访问链接】 论文链接&#xff1a;https://ieeexplore.ieee.or…

快速上手 HarmonyOS 应用开发

一、DevEco Studio 安装与配置 1. DevEco Studio 简介 DevEco Studio 是 HarmonyOS 的一站式集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的工具和功能&#xff0c;支持 HarmonyOS 应用开发的全流程。 2. DevEco Studio 下载与安装 下载地址&#xff1a…

Vue如何构建项目

目录 1.安装Node.js 2.换源(建议) 3.选择一个目录 4.创建一个vue项目 5.验证是否成功 1.安装Node.js 安装18.3或更⾼版本的 Nodejs 点击下载->Node.Js中文网 node -v npm -v 安装好后在windows的cmd窗口下运行 如果能运行出结果就说明安装好了。 2.换源(建议) //…

HTML拖拽功能(纯html5+JS实现)

1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…

初识算法和数据结构P1:保姆级图文详解

文章目录 前言1、算法例子1.1、查字典&#xff08;二分查找算法&#xff09;1.2、整理扑克&#xff08;插入排序算法&#xff09;1.3、货币找零&#xff08;贪心算法&#xff09; 2、算法与数据结构2.1、算法定义2.2、数据结构定义2.3、数据结构与算法的关系2.4、独立于编程语言…

Linux 多路径Multipath学习

文章目录 Linux 多路径Multipath学习1. 简介1.1 Multipath I/O 技术 2. Multipath安装与使用2.1 安装2.2 启动 3. scsi设备模拟器scsi_debug3.1 简介3.2 加载 scsi_debug3.3 查看 scsi_id3.4 配置多个模拟设备3.5 聚合多路径 4. 删除聚合和单设备4.1 删除mpath4.2 删除 scsi 设…

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构&#xff08;一&#xff09;远程管理系统&#xff08;二&#xff09;资源管理系统&#xff08;三&#xff09;SLA 管理系统&#xff08;四&#xff09;计费管理系统 二、安全与可靠性保障&#xff08;一&#xff09;数据安全防线&#xff08;…

Observability:利用 GCP Vertex AI 集成提升 LLM 可观察性

作者&#xff1a;来自 Elastic Ishleen Kaur•Muthukumar Paramasivam 随着组织越来越多地将 LLM 用于内容创建、检索增强生成 (Retrieval-Augmented Generation - RAG) 和数据分析等 AI 应用&#xff0c;SRE 和开发人员面临着新的挑战。监控工作流、分析输入和输出、管理查询延…

Node.js - Express框架

1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架&#xff0c;主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一&#xff0c;具有轻量级、灵活和功能丰富的特点。 核心概念包括路由&#xff0c;中间件&#xff0c;请求与响应&a…

Linux Top 命令 load average 指标解读

前言 作为平台开发的同学&#xff0c;维护平台稳定性是我们最基本的工作职责&#xff0c;下面主要介绍下top 命令里 &#xff0c;load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载&#xff0c;它表示运…

【大数据】机器学习------神经网络模型

一、神经网络模型 1. 基本概念 神经网络是一种模拟人类大脑神经元结构的计算模型&#xff0c;由多个神经元&#xff08;节点&#xff09;组成&#xff0c;这些节点按照不同层次排列&#xff0c;通常包括输入层、一个或多个隐藏层和输出层。每个神经元接收来自上一层神经元的输…