算法---双指针练习-7(三数之和)

三数之和

  • 1. 题目解析
  • 2. 讲解算法原理
  • 3. 编写代码

1. 题目解析

题目地址:三数之和

在这里插入图片描述

2. 讲解算法原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 首先对输入的数组进行排序,以便后续使用双指针法。
  • 初始化一个空的二维向量 ret,用于存储结果。
  • 使用一个循环遍历数组中的每个元素,假设当前元素为 nums[i]。
  • 如果 nums[i] 大于0,则跳出循环,因为排序后的数组中不可能存在三个数之和为0。
  • 将 nums[i] 取相反数,记为 temp,即 temp = -nums[i]。
  • 初始化两个指针 left 和 right,分别指向 i+1 和数组末尾。
  • 在 left < right 的条件下,进行循环:
  • 如果 nums[left] + nums[right] < temp,说明和偏小,将 left 右移一位。
    如果 nums[left] + nums[right] > temp,说明和偏大,将 right 左移一位。
    如果 nums[left] + nums[right] == temp,说明找到了一组解,将 {nums[left], nums[right], nums[i]} 加入到 ret 中。
  • 然后将 left 右移一位,right 左移一位,继续寻找下一组解。
  • 同时需要进行去重处理,即跳过所有与当前值相同的元素,以防止重复的解。
  • 在每次循环结束后,将指针 i 右移一位,继续寻找下一个元素的解。
    同样需要进行去重处理,跳过所有与当前值相同的元素。
  • 最后返回结果 ret。

3. 编写代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ret;
        //排序
        sort(nums.begin(),nums.end());
        int left=0,right=nums.size()-1;
        int n=nums.size();
        //利用双指针解决
        for (int i=0;i<n;)
        {
            if(nums[i]>0) break;
            int temp=-nums[i];
            left=i+1;
            right=n-1;
            while( left<right)
            {
                if((nums[left]+nums[right])<temp)
                left++;
                else if((nums[left]+nums[right])>temp)
                right--;
                else
                {
                    ret.push_back({nums[left],nums[right],nums[i]});
                    left++;
                    right--;
                    //查重,防止越界
                    while(left<right && nums[left]==nums[left-1])
                    {
                        left++;
                    }
                    while(left<right && nums[right]==nums[right+1])
                    {
                        right--;
                    }  
                }
                
                
            }
            i++;
            while(i<n && nums[i]==nums[i-1])
            {
                i++;
            }
        }
        return ret;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spark性能优化指南——高级篇

调优概述 有的时候&#xff0c;我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜&#xff0c;此时Spark作业的性能会比期望差很多。数据倾斜调优&#xff0c;就是使用各种技术方案解决不同类型的数据倾斜问题&#xff0c;以保证Spark作业的性能。 数据倾斜发生时的现…

【Idea】八种Debug模式介绍

1.行断点 在对应的代码行左侧边栏点击鼠标左键&#xff0c;会出现一个红色圆圈&#xff0c;以debug模式执行时当代码运行到此处则会停止&#xff0c;并可以查询相关上下文参数 2.方法断点 在方法左侧点击创建断点,在方法进入时会停止&#xff0c;同时可以右键断点&#xff0c;…

Jenkins Pipeline实现Golang项目的CI/CD

Jenkins Pipeline实现Golang项目的CI/CD 背景 最近新增了一个Golang实现的项目&#xff0c;需要接入到现有的流水线架构中。 流程图 这边流程和之前我写过的一篇《基于Jenkins实现的CI/CD方案》差不多&#xff0c;不一样的是构建现在是手动触发的&#xff0c;没有配置webho…

在 Python 中从键盘读取用户输入

文章目录 如何在 Python 中从键盘读取用户输入input 函数使用input读取键盘输入使用input读取特定类型的数据处理错误从用户输入中读取多个值 getpass 模块使用 PyInputPlus 自动执行用户输入评估总结 如何在 Python 中从键盘读取用户输入 原文《How to Read User Input From t…

Elixir and Pylons 中多态继承和自关联关系的创建

我们知道&#xff0c;在Elixir和Pylons中&#xff0c;多态继承和自关联关系是两个独立的概念&#xff0c;分别用于处理不同的情况。而在Pylons中&#xff0c;多态继承通常由SQLAlchemy提供的 polymorphic 关系来实现。下面分别介绍在Elixir和Pylons中如何创建多态继承和自关联关…

vue之性能优化

1.路由懒加载 所谓路由懒加载&#xff0c;其实就是路由通过import动态引入&#xff0c;而不是在文件最上面一个个全部引入&#xff0c;因为JS执行的时候会优先执行引入的文件&#xff0c;如果一次性引入过多&#xff0c;则会增加处理时长。 2.图片懒加载 图片在网页加载过程…

从零搭建React18.2+ReactRoute6.22+TS5+RTK2.2搭配antd5+antd-style书写All in Js完整体验项目规范

1. 使用CRA创建项目 全局设置npm淘宝镜像源 npm config set registry https://registry.npmmirror.com -g使用最新版create-react-app初始化项目结构 npx create-react-app custom-template --template typescript初始化项目之后在package.json文件中配置使用node>18.0.0…

路径总和00

题目链接 路径总和 题目描述 注意点 树中节点的数目在范围 [0, 5000] 内-1000 < Node.val < 1000 解答思路 要判断是否有一条从根节点开始到叶子节点节点总和为targetSum的路径&#xff0c;首先想到使用深度优先遍历&#xff0c;不断递归找到叶子节点且保存该路径的…

Aigtek电压放大器设计流程是什么样的

电压放大器是电子电路中常见的一种模块&#xff0c;用于放大输入信号的电压幅值。在实际设计过程中&#xff0c;需要考虑多个因素&#xff0c;包括放大器的增益、带宽、稳定性和功耗等。下面将介绍电压放大器设计的一般流程。 确定需求&#xff1a;首先需要明确设计的目标和需求…

CrossOver2024实现Mac/Linux上快速运行Win软件和游戏

作为软件产品专家&#xff0c;我对各类软件都有较为深入的了解&#xff0c;下面介绍CrossOver2024这款软件的功能特点。 CrossOver2024是一款功能强大的类虚拟机软件&#xff0c;它的设计目标是在Mac和Linux系统上实现Windows软件和游戏的快速运行。这款软件不仅具有出色的兼容…

Spark Core

Spark Core 一、Spark RDD RDD概述 1.RDD基础 2.RDD源代码描述 3.RDD特性 4.Spark宽窄依赖 RDD创建 在驱动器中创建RDD 1.parallelize 读取外部数据集创建RDD 2.textFile RDD操作 缓存rdd到内存 1.RDD转化操作 2.常见的转化操作 3.RDD行动操作 4.常见的行动操作 Spark…

面试官:MySQL的七种日志

哪七种日志日志&#xff1f; 错误日志&#xff08;error log&#xff09; error log主要记录MySQL在启动、关闭或者运行过程中的错误信息&#xff0c;在MySQL的配置文件my.cnf中&#xff0c; 可以通过log-error/var/log/mysqld.log 执行mysql错误日志的位置。 慢查询日志&a…

kpm算法

这里写自定义目录标题 介绍KMP算法的核心思想KMP算法的步骤例题问题分析图解代码输出结果 介绍 KMP&#xff08;Knuth-Morris-Pratt&#xff09;算法是一种用于在一个文本串&#xff08;text&#xff09;中查找一个模式串&#xff08;pattern&#xff09;的高效字符串匹配算法…

基于java的足球联赛管理系统(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

大数据与云计算

目录 一、大数据时代二、云计算——大数据的计算三、云计算发展现状四、云计算实现机制五、云计算压倒性的成本优势 一、大数据时代 我们先来看看百度关于 “大数据”&#xff08;Big Data&#xff09;的搜索指数。 可以看出&#xff0c;“大数据” 这个词是从2012年才引起关注…

趣学前端 | Taro迁移完成之后,总结了一些踩坑经验

背景 四月份的时候&#xff0c;尝试将老的移动端项目改造成多端。因为老项目使用的React框架&#xff0c;综合考量&#xff0c;保障当前业务开发的进度同时&#xff0c;进行项目迁移&#xff0c;所以最后选择了Taro框架。迁移成本会低一些&#xff0c;上手快一些。 上个月&am…

docker部署在线聊天室平台Fiora

Fiora 是一款开源免费的在线聊天系统 https://github.com/yinxin630/fiora 部署 创建docker网络 docker network create fiora-networkdocker-compose部署 vim docker-compose.yml version: 3 services:fiora_redis:image: rediscontainer_name: fiora_redisrestart: alway…

Linux 地址空间

目录 一、程序地址空间 1、虚拟地址 Makefile新写法 2、进程地址空间分布 3、栈&堆 4、static修饰局部变量 5、字符串常量不可修改 6、虚拟地址与物理地址的联系 二、CPU读取程序全过程 1、形成可执行程序 2、生成虚拟地址 3、程序的启动 4、创建进程 5、地…

11---数字温度 OR 湿度传感器电路设计

视频链接 数字温度or湿度传感器电路设计02_哔哩哔哩_bilibili 数字温度 OR 湿度传感器电路设计 1、温湿度传感器 DHT11 DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度-5%RH&#xff0c; 温度-2℃&#xff0c;量程湿度20-90%RH&#xff0c; 温度0~50℃。 D…

maven运行spring boot项目

我用idea想跑一个整合flowable的spring boot项目&#xff0c;但是跑不起来&#xff0c;原因是jdk版本不够高。但是我的idea是2018版本&#xff0c;最高只能支持到jdk11。就想办法不用idea编译、打包、运行项目。因为spring boot是maven项目&#xff0c;所以可以用maven进行打包…