LeetCode 15. 三数之和

2023-11-08

题目链接:https://leetcode.cn/problems/3sum/

1.排序+双指针

思路如下:

对数组进行排序。枚举第一个数 n u m s [ i ] nums[i] nums[i],跳过第一个数的重复数字。双指针寻找第二个数 n u m s [ l ] nums[l] nums[l] 和第三个数 n u m s [ r ] nums[r] nums[r]

令左指针 l = i + 1 l=i+1 l=i+1,右指针 r = n − 1 r=n−1 r=n1,当 l < r l<r l<r 时,执行循环:

  • 若三数之和小于 0 0 0,说明 n u m s [ l ] nums[l] nums[l] 太小, l l l 右移;
  • 若三数之和大于 0 0 0,说明 n u m s [ r ] nums[r] nums[r] 太大, r r r 左移;
  • 若三数之和等于 0 0 0,则保存当前解 { n u m s [ i ] , n u m s [ l ] , n u m s [ r ] } \left\{ nums[i], nums[l], nums[r] \right\} {nums[i],nums[l],nums[r]},并将 l , r l, r l,r 移到下一位置,寻找新的解。同时判断新位置的数是否和上一位置的数重复,跳过第二个数和第三个数的重复数字。
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> res;
        sort(nums.begin(), nums.end()); // 对数组进行排序
        for (int i = 0; i < n - 2; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过第一个数的重复数字
            int l = i + 1, r = n - 1;
            while (l < r) {
                int t = nums[i] + nums[l] + nums[r];
                if (t < 0) {
                    l++;
                } else if (t > 0) {
                    r--;
                } else {
                    res.push_back({nums[i], nums[l], nums[r]});
                    l++;
                    r--;
                    while (l < r && nums[l] == nums[l - 1]) l++; // 跳过第二个数的重复数字
                    while (l < r && nums[r] == nums[r + 1]) r--; // 跳过第三个数的重复数字
                }
            }
        }
        return res;
    }
};

2.对上面代码加剪枝

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> res;
        sort(nums.begin(), nums.end()); // 对数组进行排序
        for (int i = 0; i < n - 2; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过第一个数的重复数字
            if (nums[i] + nums[i + 1] + nums[i + 2] > 0) break; // 剪枝一
            if (nums[i] + nums[n - 2] + nums[n - 1] < 0) continue; // 剪枝二
            int l = i + 1, r = n - 1;
            while (l < r) {
                int t = nums[i] + nums[l] + nums[r];
                if (t < 0) {
                    l++;
                } else if (t > 0) {
                    r--;
                } else {
                    res.push_back({nums[i], nums[l], nums[r]});
                    l++;
                    r--;
                    while (l < r && nums[l] == nums[l - 1]) l++; // 跳过第二个数的重复数字
                    while (l < r && nums[r] == nums[r + 1]) r--; // 跳过第三个数的重复数字
                }
            }
        }
        return res;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode 15. 三数之和 的相关文章

随机推荐

  • SpringBoot可执行包结构

    相对于传统的JAVA可执行包 jar文件 SpringBoot的包结构有比较大的不一样 标准的JDK定义的jar文件里面是不能够有内嵌jar文件的 所以通常我们在执行一个jar文件里面的应用程序时 还需要通过 classpath来告诉JDK
  • Atcoder beginner contest 303

    A Similar String AC代码 include
  • 动物森友会【科大讯飞杯L题】【二分答案+最大流】

    题目链接 有N个物品 一周有7天 然后呢 要对应的每个物品都要达到各自的需求数量 于是问 最少需要几天才可以达到要求 很明显的 这是线性关系的 我们可以用二分答案来解决这个问题 然后呢怎么知道是否满足条件也就是来确定的 要满足每个物品都要拿
  • [Unity3D]第一人称角色控制器

    Unity3D 最简单最详细的第一人称角色控制器 自学Unity3D有一段时间了 一直想弄一个第一人称角色控制器 网上还是有很多教程和资料 但感觉有很多教程和资料理解起来比较复杂 在这里我结合网上所学的知识自己写了一个比较容易理解的Unit
  • python爬虫归纳_【知识归纳】史上最全的Python爬虫抓取技巧总结

    原标题 知识归纳 史上最全的Python爬虫抓取技巧总结 一 最基本的抓站 import urllib2 content urllib2 urlopen http XXXX read 二 使用代理服务器 这在某些情况下比较有用 比如IP被封
  • Java-代码审核CodeReview要点总结

    1 颗粒度划分要细 例如 当分组循环一个请求一个服务时 如果其中的一个请求抛出异常 应该在catch中捕获 记录错误日志 让循环继续进行 2 非空判断和边境检查 对数组和集合的判断 对map的key值判断 对list的值得判断 3 错误码和
  • Python中list转换为numpy数组出现的问题

    问题为 现有的数据list LuKou train DF KnownCameraTrajec 是一个1000000 30的list数据类型 使用np array list LuKou train DF KnownCameraTrajec 转
  • Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager

    在最近创建新项目时遇到如题的错误 在重新删除build tools 31版本后还是报错 其实不需要将SDK构建工具从31降为30或更改编译SDK版本 主要问题是SDK build tools31 缺少两个文件 dx bat dx jar 解
  • 记一次SpringBoot项目的Invalid bound statement (not found)错误

    目录 一 前言 二 解决方案 1 第一种 语法错误 2 第二种 编译错误 3 第三种 配置错误 4 第四种 粗心大意 三 写在后面 一 前言 今天写项目的过程中突然报错 Invalid bound statement not found 百
  • 项目启动报错信息:java.lang.NoClassDefFoundError: org/apache/commons/el/Logger

    注 仅供参考 个人运行项目时遇到的问题和解决方案 希望可以给大家带来一丢思路 并非普适性 问题描述 启动tomcat时报错 项目未运行成功 具体报错 十月 18 2021 9 10 11 下午 org apache catalina cor
  • Fmask算法——影像云检测算法

    总结Fmask算法的学习资料 1 经典论文 1 Object based cloud and cloud shadow detection in Landsat imagery 2 Improved cloud and cloud shad
  • 如何建立异地容灾备份体系

    GB T22239 2019 信息安全技术 网络安全等级保护基本要求 即等保2 0 已于2019 12 1 正式实施 其中第二级安全通用要求 应提供异地数据备份功能 利用通信网络能将重要数据定时批量传送至备用场地 第四级安全通用要求 应建立
  • Matlab画图 常用功能及属性设置脚本

    一 plot使用脚本 常规设置 1 线型 颜色 宽度 2 legend 字体 字号 位置 3 label 字体 字号 4 title 字体 字号 加粗 5 gca 边框宽度 坐标轴字体 坐标轴范围 网格 x linspace 0 2 pi
  • 万字长文详解特斯拉自动驾驶体系(感知/规控/标注/仿真)

    作者 和君 编辑 禾隐记 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 汽车革命的上半场是电动化 下半场是智能化 电动化只是改变了汽车的动力供给方式 并没有改变汽车的性质
  • ElasticSearch系列十二:掌握ES使用Java API

    一 Java连接ElasticSearch6 x版本 可整合到spring中
  • 洛谷 P1885 Moo

    P1885 Moo 题目描述 奶牛Bessie最近在学习字符串操作 它用如下的规则逐一的构造出新的字符串 S 0 moo S 1 S 0 m ooo S 0 moo m ooo moo moomooomoo S 2 S 1 m oooo S
  • AcWing 1381. 阶乘

    题目 N 的阶乘 记作 N 是指从 1 到 N 包括 1 和 N 的所有整数的乘积 阶乘运算的结果往往都非常的大 现在 给定数字 N 请你求出 N 的最右边的非零数字是多少 例如 5 1 2 3 4 5 120 所以 5 的最右边的非零数字
  • 安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作

    文章目录 JS原生开发 文件上传 变量 对象 函数 事件 JS导入库开发 登录验证 JQuery库 Ajax技术 JS导入库开发 编码加密 逆向调试 JS原生开发 文件上传 变量 对象 函数 事件 1 布置前端页面 2 JS获取提交数据 3
  • 超详细Hyperledger Fabric2.3.3开发教程

    最近一直在总结Hyperledger Fabric的开发教程 主要包括 1 什么是Hyperledger 区块链 Hyperledger Fabric 01 超级账本介绍 2 Fabric 2 3 3安装教程 区块链 Hyperledger
  • LeetCode 15. 三数之和

    文章目录 1 排序 双指针 2 对上面代码加剪枝 题目链接 https leetcode cn problems 3sum 1 排序 双指针 思路如下 对数组进行排序 枚举第一个数 n u m s i