LeetCode 18. 四数之和

2023-11-10

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

1.排序+双指针

class Solution {
    using ll = long long;
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        int n = nums.size();
        vector<vector<int>> res;
        if (n < 4) return res;
        sort(nums.begin(), nums.end()); // 对数组进行排序
        for (int i = 0; i < n - 3; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过第一个数的重复数字
            for (int j = i + 1; j < n - 2; j++) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue; // 跳过第二个数的重复数字
                int l = j + 1, r = n - 1;
                while (l < r) {
                    ll t = (ll)nums[i] + nums[j] + nums[l] + nums[r];
                    if (t < target) {
                        l++;
                    } else if (t > target) {
                        r--;
                    } else {
                        res.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--; // 跳过第四个数的重复数字
                    }
                }
            }
        }
        return res;
    }
};

2.对上面代码加剪枝

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

LeetCode 18. 四数之和 的相关文章

随机推荐

  • 一、PID控制原理

    在模拟控制系统中 控制器最常用的控制规律是PID控制 模拟PID控制系统原理框图如下图 系统由模拟PID控制器和被控对象组成 PID控制器是一种线性控制器 它根据给定值Yd t 与实际输出值Y t 构成控制偏差 err Yd Y PID的控
  • 接口继承接口,类实现接口

    接口继承接口 1 类与类之间是单继承的 直接父类只有一个 2 类与接口之间是多实现的 一个类可以有多个接口 3 接口与接口之间是多继承的 注意事项 1 多个父接口当中的抽象方法如果重复没有关系 抽象的没事 没有方法体 2 多个父接口当中的默
  • windows为配置安全策略

    文章目录 限制 Management Manage01 05 只能从Client登录 限制 Finance F01 10 不能关闭计算机和重启计算机 所有的域计算机和域用户都能自动注册证书 证书颁发机构已经颁发过一次就不再重复颁发 除非证书
  • ChatGPT国内镜像软件推荐

    1 ChatGPT镜像是什么 ChatGPT镜像是一种技术方案 它将OpenAI的ChatGPT模型与相关技术部署在用户本地或私有服务器上 采用这种方式 用户可以在自己的环境中运行ChatGPT模型 无需依赖于OpenAI的在线API服务
  • 考研复试数据库原理课后习题(十四)——内存数据库系统

    内存数据库系统 1 内存数据库和磁盘数据库有什么区别 2 内存数据库的特点有哪些 内存是计算机存储体系结构中能够被程序可控访问 相对于硬件控制的cache 的最高层次 是能够提供大量数据存储的最快的存储层 内存数据库具有几个重要特性 高吞吐
  • 【RT-DETR】《DETRs Beat YOLOs on Real-time Object Detection》译读笔记

    DETRs Beat YOLOs on Real time Object Detection 摘要 近期 基于端到端的 transformer based的检测器 DETRs 取得了卓越的性能 然而 DETRs类模型计算成本高的问题尚未得到
  • 前沿应用丨大规模无人机集群与“虚实结合”半实物仿真系统

    一 应用背景 无人机集群在军事 安全 救援 航空监测 物流配送等领域具有广泛的应用前景 它可以提高任务执行的效率 灵活性和安全性 同时降低人力资源的需求和风险 无人机集群研究涉及多个学科领域 如机器人学 控制理论 通信技术和人工智能等 目前
  • TCP/IP 网络设备与基础概念

    本文目的在于按照自己的理解 解释清楚网络中的一些基本概念 以及支撑概念落地的网络设备的工作原理 从而解决网络联通性问题 以及为定量分析网络性能问题打基础 如有错漏 欢迎指正 什么是 WAN vs LAN 什么是子网 网关 LAN vs 子网
  • 小白笔记——HTML到Java的Date型转换

    本笔记旨在记录新手学习编程时遇到的问题以及解决方法 主要是作为备忘录来使用 希望路过的大神可以指点一二 同时也希望这个笔记可以帮助到其他有同样困惑的小伙伴 大学毕业之后就再没有用中文写过文章了 所以我写的东西字里行间都会透露出一股子翻译大碴
  • 星星之火-58:CPRI协议缺点,eCPRI协议是如何克服CPRI协议的不足?

    1 CPRI协议不足 CPRI数据传输链路属于空口协议栈 硬件 应用软件共同实现空口协议栈 RFIC gt FPGA RF gt 时域采样 CPRI gt CPRI gt DSP gt L1 软件 gt L2软件 gt L3软件 1 CPR
  • Orcale产生随机数

    1 Oracle中产生uuid的方法 select lower sys guid from dual 2 oracle中函数nvl 如果oracle第一个参数为空那么显示第二个参数的值 如果第一个参数的值不为空 则显示第一个参数本来的值
  • [orin] nvidia orin 上配置tensorrt

    版本 jetpack 5 0 1 tensorrt 8 4 1 5 概述 tensorrt会跟着jetpack的包一起安装 系统本身自带的python是3 8的版本 tensorrt的python包位于这个路径下 cd usr lib py
  • 可视化dockerregistry中的镜像

    1 先来个简单的 docker run d p 5000 5000 name registry srv registry 2 docker run it p 8080 8080 name registry web link registry
  • WebSocket的核心事件

    前言 在上一篇文章中 Spring Boot使用WebSocket模拟聊天 已经简单实现了我们WebSocket的Demo 里面使用的WebSocket事件函数在此做一个总结 WebSocket整体通讯的流程就是 建立链接 gt 发送消息
  • 用定时器0控制切换流水灯顺序,用外部中断控制两种数码管显示方式

    include reg52 h 此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16 对数据类型进行声明定义 typedef unsigned char u8 sbit LSA P2 2 sbit LS
  • 开关电源变换器稳态原理分析(电感伏秒平衡及电容电荷平衡)

    在大量开关周期中 当开关频率固定时 开关占空比D也保持恒定 例如对n个周期 电流波形和电压波形在每个开关周期是重复的 这就意味着电压波形和电流波形变成周期性波形 周期为T 即i n 1 T i nT v n 1 T v nT 这样的状态就称
  • 通过 Debian Packages安装ROS 2(Linux Mint20.2安装ROS2 foxy)

    安装ROS foxy的文章较少 这里记录一下自己安装时遇到的一些坑 1 https raw githubusercontent com访问不了 1 设置语言环境 locale check for UTF 8 sudo apt update
  • openssh升级编译安装,更新Openssh和openssl

    openssh下载 https www openssh com openssl下载 https www openssl org 注 openssh需要配套openssl使用 软件包安装和编译安装的区别 软件包安装 yum provides
  • pycharm中从虚拟环境导包

    一 现有环境 在terminal中输入命令 pip freeze gt requirements txt 下载包到本地 二 把下载好的包放入新环境项目的跟目录下 新环境会提示是否安装 点击 install requirements 点击in
  • LeetCode 18. 四数之和

    文章目录 1 排序 双指针 2 对上面代码加剪枝 题目链接 https leetcode cn problems 4sum 1 排序 双指针 class Solution using ll long long public vector