双指针算法(二)

三数之和

三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

思路:先排序,保证数组不降序排列(为了后续去重操作)。从左往右一次固定一个数 tmp ,在右边使用双指针算法,找到两个数的和等于 - tmp 的情况(等价于三个数的和等于0),找到之后不停止,继续遍历,直至找到固定数为 tmp 的情况下的所有情况,右移 tmp 位置,直至 tmp 到达区间的最倒数第三个位置。

‘不同的三元组’,去重操作:在找到一组目标值后,因为已经排好序了,所以只需要让双指针向中间移动,如果移动后值等于之前值的话,就再次移动,直到找到一个不重复的位置!

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> vv;
        int tmp = 0;
        int tmpi = nums.size()-3;
        while(tmp <= tmpi)
        {
            if(nums[tmp]>0) break;
            int left = tmp + 1;
            int right = nums.size() - 1;
            while(left < right)
            {
                if(nums[left] + nums[right] > -nums[tmp]) right --;
                else if(nums[left] + nums[right] < -nums[tmp]) left ++;
                else
                {
                    vv.push_back({nums[left],nums[right],nums[tmp]});
                    right--;
                    left++;
                    while(nums[right+1] == nums[right] && right > left) right--;
                    while(nums[left-1] == nums[left] && left < right) left++;
                }
            }
            tmp++;
            while(nums[tmp-1]==nums[tmp] && tmp <= tmpi) tmp++;
        }
        return vv;
    }
};

四数之和

四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

思路:四数之和可以看做是先固定一个数,区间右边就当做三数之和来处理。先固定一个数 a,右边当做三数之和,再在三数之和中固定一个数 b,在区间右边利用双指针来处理即可。

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> vv;
        if(nums.size()<4) return vv;
        sort(nums.begin(),nums.end());
        size_t n = nums.size();
        for(size_t i = 0;i <= n - 4;)
        {
            // 固定最左边的数 nums[i],三数之和的目标变为  target - nums[i]
            long long target1 = target - nums[i];
            for(int j = i + 1;j <= n-3;)
            {
                //固定num[i]右边的数 nums[j],双指针的目标变为 target - nums[i] - nums[j]
                long long target2 = target1 - nums[j];
                size_t left = j+1, right = n -1;
                while(left < right)
                {
                    if(nums[left] + nums[right] > target2) right--;
                    else if(nums[left] + nums[right] < target2) left++;
                    else
                    {
                        vv.push_back({nums[i],nums[j],nums[left],nums[right]});
                        left++;
                        right--;
                        while(nums[left] == nums[left-1] && left<right) left++;
                        while(nums[right] == nums[right+1] && left<right) right--;
                    }
                }
                j++;
                while(nums[j] == nums[j-1] && j <= n-3) j++;
            }
            i++;
            while(nums[i] == nums[i-1] && i<= n-4) i++;
        }
        return vv;
    }
};

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

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

相关文章

【gojs】Invalid div id; div already has a Diagram associated with it

刷新gojs&#xff0c;控制台报错 <div id"myDiagramDiv"></div>import go from "gojs"; data() {return {myDiagram: null,} }, mounted() {this.drawTopo(); }, method() {drawTopo() {const $ go.GraphObject.make;this.myDiagram $(go.Di…

【C++】POCO学习总结(十九):哈希、URL、UUID、配置文件、日志配置、动态库加载

【C】郭老二博文之&#xff1a;C目录 1、哈希 1.1 说明 std::map和std::set 的性能是&#xff1a;O(log n) POCO哈希的性能比STL容器更好&#xff0c;大约快两&#xff1b; POCO中对应std::map的是&#xff1a;Poco::HashMap&#xff1b; POCO中对应std::set的是 Poco::Hash…

推荐几款值得收藏的3DMAX插件

推荐几款值得收藏的3DMAX插件 StairGenerator StairGenerator一键楼梯插件&#xff0c;不需要花费太多的时间&#xff0c;轻松从2D平面图生成3D楼梯模型&#xff0c;生成的楼梯模型细节丰富真实。 【主要功能】 1.简单&#xff1a;轻松实现2D到3D建模。 2.具有最详细三维结…

接口优化的常见方案实战经验

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 二、接口优化方案总结 1.批处理 批量思想&#xff1a;批量操作数据库…

css3实现动态心电图折线

css3实现动态心电图折线 M&#xff08;moveto&#xff09;&#xff1a;需要两个参数&#xff08;x轴和y轴坐标&#xff0c;移动到的点的x轴和y轴的坐标L&#xff08;lineto&#xff09;&#xff1a;需要两个参数&#xff08;x轴和y轴坐标&#xff09;&#xff0c;它会在当前位置…

Windows使用VNC Viewer远程桌面Ubuntu【内网穿透】

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

LSTM ——作业

习题6-4 推导LSTM网络中参数的梯度&#xff0c; 并分析其避免梯度消失的效果 习题6-3P 编程实现下图LSTM运行过程 1. 使用Numpy实现LSTM算子 import numpy as np # 创建一个numpy数组x&#xff0c;它是一个4x4的矩阵&#xff0c;包含9个元素 x np.array([[1, 0, 0, 1],[3, …

python排序算法,冒泡排序和快排

对于排序算法中比较知名的两个算法&#xff0c;分别就是冒泡排序和快速排序&#xff0c;在日常学习和使用中都会听到这两种排序算法的名称&#xff0c;这里主要介绍如何使用python来实现这两种排序算法。 冒泡排序的实现&#xff1a;一是从集合第一个元素开始&#xff0c;每两…

14:00面试,14:05就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

LINUX常用命令——gcc编译篇

LINUX常用命令——gcc编译篇 本文设计了LINUX一些基本命令的讲解包括基本命令ls,man;编译命令gcc以及相关参数说明&#xff0c;【练习&#xff1a;输出斐波那契数列】 文章目录 LINUX常用命令——gcc编译篇一、常用基本命令的讲解1.1 ls 列出目录内容1.2 man 查看命令手册 二、…

Linux shell编程学习笔记36:read命令

目录 0 前言1 read命令的功能、格式、返回值和注意 1.1 命令功能1.2 命令格式1.3 返回值1.4 注意事项2 命令应用实例 2.1 一次读入多个变量值2.2 不指定变量名2.3 测试read命令的返回值2.3 指定输入时限并进行相应处理2.4 -t 指定结束符2.5 -n 指定输入字符个数2.6 -N 指定输入…

存储:windows 10 硬盘盒 新盘 SSD分区

1.准备好绿联2.5英寸 2.准备好 SSD 磁盘 3.接入硬盘和盒子 4.win10 电脑 win x 然后选择磁盘管理 &#xff08;磁盘管理 K&#xff09; 5.它会提示需要初始化的一个新的磁盘&#xff0c;确定初始化 6.添加卷 7.命名盘符 8.检测是否识别到盘符 9.end

使用drawio绘制依赖关系图

使用drawio绘制依赖关系图 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云端存…

gitlab(gitlab-ce)下载,离线安装

目录 1.下载 2.安装 3.配置 4.启动 5.登录 参考&#xff1a; 1.下载 根据服务器操作系统版本&#xff0c;下载对应的RPM包。 gitlab官网&#xff1a; The DevSecOps Platform | GitLab rpm包官网下载地址: gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像地…

Node.js多版本管理切换

nodejs多版本管理软件&#xff1a;https://github.com/coreybutler/nvm-windows 安装方法 https://www.jianshu.com/p/9ba4cd0706da

Spring Cloud Alibaba核心技术宝典,分布式系统中间件实战案例(百度云下载)

前言 《Spring Cloud Alibaba学习笔记》其实是阿里的微服务解决方案&#xff0c;是阿里巴巴结合自身微服务实践,开源的微服务全家桶&#xff0c;在Spring Cloud项目中孵化成为Spring Cloud的子项目。第一代的Spring Cloud标准中很多组件已经停更,如&#xff1a;Eureak,zuul等。…

HashMap扩容机制详解

目录 1. 扩容的触发条件 2. 扩容的具体步骤 2.1 计算新的容量 2.2 创建新的桶数组 2.3 将元素重新分配到新的桶数组中 2.4 更新容量和阈值 3. 与并发性能的关系 4. 扩容的性能优化 5. 总结 HashMap是Java中常用的数据结构之一&#xff0c;用于存储键值对。在HashMap内…

Shell三剑客:sed(命令)二

一、插入命令&#xff1a;i&#xff08;之前&#xff09; [rootlocalhost ~]# sed -r 2i aaaaaaa passwd.txt root:x:0:0:root:/root:/bin/bash aaaaaaa bin:x:1:1:bin:/bin:/sbin/nologin[rootlocalhost ~]# sed -r 2i aaaaaaa\ > bbb\ > ccc passwd.txt root:x:0:0:r…

【C++初阶】八、初识模板(泛型编程、函数模板、类模板)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】七、内存管理 &#xff08;C/C内存分布、C内存管理方式、operator new / delete 函数、定位new表达式&#xff09; -CSDN博客 目录 一 . 泛型编程 二 . 函数模板 函数模板…

VRP的分解策略

关键词 vehicle routing, heuristics, decomposition strategies 文章概述 本文讨论了车辆路径规划启发式算法的分解策略。分解策略包括确定子问题的大小、相关性信息、子问题的解决技术以及利用子问题解的方法。选择合适的子问题大小是控制难度和改进潜力的关键因素。相关性…