【算法|双指针系列No.8】leetcode18. 四数之和

news2025/6/19 13:56:45

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
在这里插入图片描述

目录

  • 1️⃣题目描述
  • 2️⃣算法分析
  • 3️⃣代码编写

1️⃣题目描述

给你一个由 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

2️⃣算法分析

解题思路依然是双指针和利用单调性,如下:

  • 在第一个指针i确定的情况下,设定第二个指针j=i+1,从i+1到n-1进行遍历。
  • 在第一个和第二个指针确定的情况下,设定两个指针l=j+1和r=n-1,分别表示左右两端的指针。对l和r指针进行迭代,判断nums[l]+nums[r]与目标值target-nums[i]-nums[j]的大小关系,如果小于目标值,则将l指针右移,如果大于目标值,则将r指针左移,如果等于目标值,则将结果加入ret数组,并继续移动l和r指针。
  • 在移动l和r指针的过程中,需要注意去重,即跳过重复元素(此处为第一个需要去重的点)。
  • 遍历完l和r指针之后,移动j指针,注意去重(此处为第二个需要去重的点)。
  • 遍历完j指针之后,移动i指针,同样需要注意去重(此处为第三个需要去重的点)。
  • 最后返回ret即可

3️⃣代码编写

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int n = nums.size();
        vector<vector<int>> ret;
        for(int i = 0;i < n;)
        {
            int first = target - nums[i];
            for(int j = i + 1;j < n;)
            {
                long long second = (long long)first - nums[j];
                int l = j + 1, r = n - 1;
                while(l < r)
                {
                    if(nums[l] + nums[r] > second) r--;
                    else if(nums[l] + nums[r] < second) l++;
                    else
                    {
                        ret.push_back({nums[i],nums[j],nums[l],nums[r]});
                        l++,r--;
                        while(l < r && nums[l] == nums[l - 1]) l++;
                        while(l < r && nums[r] == nums[r + 1]) r--;
                    }
                }
                j++;
                while(j < n && nums[j] == nums[j - 1]) j++;
            }
            i++;
            while(i < n && nums[i] == nums[i - 1]) i++;
        }
        return ret;
    }
};

最后就是通过啦!!!

在这里插入图片描述

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

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

相关文章

VSCode 使用 Vetur Format格式化的配置项

"vetur.format.options.tabSize": 4,"vetur.format.defaultFormatterOptions": {// for html"prettyhtml": {"wrapAttributes":false,//强制包装属性// "sortAttributes": true,//对属性按首字母排序// "bracketSpacin…

Apache Tomcat下载安装配置使用超详细

下载安装 tomcat官网 在此我们以Tomcat 9.0.81为例&#xff0c;点击下载压缩包&#xff0c;解压到自己的文件夹。 tar.gz是linux操作系统下的安装版本。zip是windows系统下的压缩版本。Windows Service Installer是windows操作系统下的exe安装版本。 检查是否配置JDK 1.…

Ubuntu 22.04.3 LTS单机私有化部署sealos

推荐使用奇数台 Master 节点和若干 Node 节点操作系统 :Ubuntu 22.04 LTS内核版本 :5.4 及以上配置推荐 :CPU 4 核 , 内存 8GB, 存储空间 100GB 以上最小配置 :CPU 2 核 , 内存 4GB, 存储空间 60GB 这里采用的Ubuntu 22.04.3 LTS 版本&#xff0c;Ubuntu 20.04.4 LTS这个版本…

JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)

基于bilibili狂神说JUC并发编程视频所做笔记 概述 什么是JUC JUC时java.util工具包中的三个包的简称 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 业务&#xff1a;普通的线程代码中&#xff0c;我们常使用Runnable接口 但Runnable没有返…

如何将jpg转化为png?

如何将jpg转化为png&#xff1f;可能有的小伙伴就会疑惑了&#xff0c;jpg和png都是图片常用的一种格式&#xff0c;为什么要进行格式的更改呢&#xff1f;那是因为PNG格式具有更好的图片质量和更少的失真。JPG&#xff08;或JPEG&#xff09;格式的图片通常是压缩过的&#xf…

C# OpenVINO 人脸识别

效果 耗时 Preprocess: 1.41ms Infer: 4.38ms Postprocess: 0.03ms Total: 5.82ms 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Text; using Syste…

ChatGPT再次成为焦点:学生放弃导师,改用ChatGPT自学

据外媒报道&#xff0c;近日&#xff0c;知名高等教育规划平台 Intelligent.com 的一项 调查显示&#xff0c;学生和家长越来越喜欢使用 ChatGPT 而不是真人导师来进行学习了。 调查结果显示&#xff0c;学生对教育援助的看法发生了重大的转变。在最近的学年中&#xff0c;85% …

解决yarn删除代理不成功的问题

之前yarn配了代理&#xff0c;但是速度不稳定&#xff0c;所以换成了淘宝源。 然后发现速度还是很慢&#xff0c;有一天忘了开代理&#xff0c;结果依赖完全不能下载了&#xff0c;报错&#xff1a;info There appears to be trouble with your network connection. Retrying.…

WebSocket连接异常 Error parsing HTTP request header Connection reset by peer

问题描述 在使用spring的方式集成websocket时&#xff0c;在配置WebSocketConfigurer后 Configuration EnableWebSocket public class WebSocketConfiguration implements WebSocketConfigurer {ResourceServletWebSocketServerHandler servletWebSocketServerHandler;Overri…

Android笔记(三)多Activity活动的切换中的简化处理

多Activity实现的跳转简单实现 Activity定义移动的界面。在本例中&#xff0c;介绍多个活动之间的切换的简化通用的实现。在本例中&#xff0c;定义三个活动MainActivity、FirstActivity和SecondActivity.要求能从MainActivity分别切换到FirstActivity和SecondActivity&#x…

VMware _ Ubuntu _ root 密码是什么,怎么进入 root 账户

文章目录 进入 root 账户设置 root 密码小结 在 VMware 安装 ubuntu 虚拟机之后&#xff0c;root 用户的密码是什么&#xff1f;安装的过程也没有提示输入 root 用户的密码&#xff0c;只有创建第一个非 root 用户的密码。但是 root 用户是存在的&#xff0c;又怎么切换到 root…

【面试高频题】难度 1/5,经典树的搜索(多语言)

题目描述 这是 LeetCode 上的 「109. 有序链表转换二叉搜索树」 &#xff0c;难度为 「中等」 Tag : 「二叉树」、「树的搜索」、「分治」、「中序遍历」 给定一个单链表的头节点 head&#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&…

Webpack和JShaman相比有什么不同?

Webpack和JShaman相比有什么不同&#xff1f; Webpack的功能是打包&#xff0c;可以将多个JS文件打包成一个JS文件。 JShaman专门用于对JS代码混淆加密&#xff0c;目的是让JavaScript代码变的不可读、混淆功能逻辑、加密代码中的隐秘数据或字符&#xff0c;是用于代码保护的…

Android笔记(四)Activity之间传递可序列化的数据的优化处理

Activity之间传递可序列化的数据 Android应用开发会常常处理数据的序列化和传递。在Android中往往采用两种方式实现数据的可序列化&#xff1a;&#xff08;1&#xff09;实现java.io.Serializable接口&#xff08;2&#xff09;实现android.os.Parcelable接口。 将类定义为an…

C++标准模板(STL)- 类型支持 (数值极限,is_modulo,digits,digits10)

数值极限 定义于头文件 <limits> 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits<int>::max() &…

Appium自动化测试框架:关键字驱动+数据驱动

1. 关键字驱动框架简介 原理及特点 关键字驱动测试是数据驱动测试的一种改进类型&#xff0c;它也被称为表格驱动测试或者基于动作字的测试。主要关键字包括三类&#xff1a;被操作对象&#xff08;Item&#xff09;、操作行为&#xff08;Operation&#xff09;和操作值&…

[python 刷题] 239 Sliding Window Maximum

[python 刷题] 239 Sliding Window Maximum 题目&#xff1a; You are given an array of integers nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each ti…

抖音直播招聘小程序可以增加职位展示,提升转化率,增加曝光度

抖音直播招聘报白是指进入抖音的白名单&#xff0c;允许在直播间或小视频中发布招聘或找工作等关键词。否则会断播、不推流、限流。抖音已成为短视频流量最大的平台&#xff0c;但招聘企业数量较少。抖音招聘的优势在于职位以视频、直播方式展示&#xff0c;留存联系方式更加精…

C语言 位操作

定义 位操作提高程序运行效率&#xff0c;减少除法和取模的运算。在计算机程序中&#xff0c;数据的位是可以操作的最小数据单位&#xff0c;理论上可以用“位运算”来完成所有的运算和操作。 左移 后空缺自动补0 右移 分为逻辑右移和算数右移 逻辑右移 不管什么类型&am…

基于PySide6的数据处理及可视化分析软件开发

基于PySide6的数据处理及可视化分析软件开发 前言 前言 絮絮叨叨&#xff1a;最近也是在实验室摸鱼&#x1f41f;的日子&#xff0c;先来占个坑位吧。最近在开发一款PC端的软件&#xff0c;打算用于我的毕业设计的最后一章。本来想用新学的框架React来作项目的前端框架&#x…