力扣hot6---双指针

题目:

TLE做法(哈希+两重for循环)

标签虽然说是用双指针,但是第一个想法真就不是双指针呀。。。就感觉这道题很像:

力扣hot1--哈希-CSDN博客

于是就用了类似的想法:

  1. 首先要排个序,至于为什么要排序,是为了好对三元组集合去重。
  2. 接下来与力扣hot1的想法一样,用哈希来存储一遍这些元素,但是有的元素可能重复了好多次(注意这里数组已经排过序了),所以unordered_map<int,vector<int>>,vector<int>记录对应的索引。
  3. 用双重for循环来判断,第三个数是否在哈希表中,如果存在,还要判断索引是不是一致,如果一致,那就还是不行。如果不一致,那就记录下来,存入res。为了方便去重,这里采用了顺序存取三个数。
  4. 最后用set去重啦,虽然TLE了,但是。。。记录一下代码(以下是TLE的代码

代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        //nums排序
        sort(nums.begin(),nums.end());
        //哈希存
        vector<vector<int>> res;
        unordered_map<int,vector<int>> hmap;
        int len=nums.size();
        for(int i=0;i<len;i++){
            hmap[nums[i]].push_back(i);
        }
        //两重for循环遍历
        for(int i=0;i<len-1;i++){
            for(int j=i+1;j<len;j++){
                //cout<<"i:"<<i<<' '<<"j:"<<j<<endl;
                //cout<<"nums_i:"<<nums[i]<<' '<<"nums_j:"<<nums[j]<<endl;
                auto iter=hmap.find(0-nums[i]-nums[j]);
                if(iter!=hmap.end()){
                    auto p=iter->second;
                    int p_len=p.size();
                    for(int k=0;k<p_len;k++){
                        if(p[k]!=i && p[k]!=j){
                            int temp=iter->first;
                            //cout<<"i:"<<nums[i]<<" j:"<<nums[j]<<" temp:"<<temp<<endl;
                            if(temp<=nums[i]){res.push_back({temp,nums[i],nums[j]});}
                            else if(temp>=nums[j]){res.push_back({nums[i],nums[j],temp});}
                            else{res.push_back({nums[i],temp,nums[j]});}
                            break;
                        }
                    }
                }
            }
        }
        //set去重
        set<vector<int>> q(res.begin(),res.end());
        res.assign(q.begin(),q.end());

        return res;
    }
};

这里记录一下set去重:

//set去重
set<vector<int>> q(res.begin(),res.end());
res.assign(q.begin(),q.end());

C++ 给vector去重的三种方法_c++ vector去重-CSDN博客

单循环+双指针做法

言归正传,双指针思路:

  1. 首先,先给数组排个序。为什么要排序呢,有点像二分的思想。这里可以先大致感受一下,L 指针在最左面,R 指针在最右面,满足三个数之和等于0,那就添加结果。小于0就说明 L 指针指的数有点小了,往右侧移动。大于0就说明 R 指针指的数有点大了,往左侧移动。
  2. 排完序后,依次遍历数组中的每个元素,就代表三个元素之和已经降维成了两个元素之和,或许可以想到哈希表的做法(为什么双指针也很方便呢?因为这道题不是返回索引,可以进行排序),后面将尝试哈希表的做法~
  3. 如果说遍历到的元素索引为 i ,那么 L = i +1,R = nums.size( ) - 1。然后进行第一段的说法,也就是:
while(L<len && R>=0 && L<R){
    if(nums[i]+nums[L]+nums[R]==0){
        res.push_back({nums[i],nums[L],nums[R]});
        while(L<R && nums[L+1]==nums[L] && L+1<len){L++;}
        while(L<R && nums[R-1]==nums[R] && R-1>=0){R--;}
            L++;R--;
    }
    else if(nums[i]+nums[L]+nums[R]<0){L++;}
    else{R--;}
}

代码如下:

C++:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        
        sort(nums.begin(),nums.end());
        
        vector<vector<int>> res;
        int len=nums.size();
        for(int i=0;i<len;i++){
            if(nums[i]>0){break;}
            if(i>0 && nums[i]==nums[i-1]){continue;}
            int L=i+1;
            int R=len-1;
            while(L<R){
                if(nums[i]+nums[L]+nums[R]==0){
                    res.push_back({nums[i],nums[L],nums[R]});
                    while(L<R && nums[L]==nums[L+1]){L++;}
                    while(L<R && nums[R]==nums[R-1]){R--;}
                    L++;
                    R--;
                }
                else if(nums[i]+nums[L]+nums[R]<0){L++;}
                else{R--;}
            }
        }
        return res;
    }
};

Python:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        res=[]
        nums.sort()
        len_nums=len(nums)
        for i in range(len_nums):
            if nums[i]>0:
                break
            if i>0 and nums[i]==nums[i-1]:
                continue
            L=i+1
            R=len_nums-1
            while L<R:
                if nums[i]+nums[L]+nums[R]==0:
                    res.append([nums[i],nums[L],nums[R]])
                    while L<R and nums[L]==nums[L+1]:
                        L+=1
                    while L<R and nums[R]==nums[R-1]:
                        R-=1
                    L+=1
                    R-=1
                elif nums[i]+nums[L]+nums[R]<0:
                    L+=1
                else:
                    R-=1
        return res
        

单循环+哈希做法

哈希思路:

数组遍历循环每一个元素,对于该元素,在该元素的右侧进行【两数之和=0-该元素】的降维处理。可参考:力扣hot1--哈希-CSDN博客

代码如下:

C++:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        
        sort(nums.begin(),nums.end());
        
        int len=nums.size();
        vector<vector<int>> res;
        for(int i=0;i<len-2;i++){
            if(nums[i]>0){break;}
            if(i>0 && nums[i]==nums[i-1]){continue;}
            unordered_map<int,int> hmap;
            int target=-nums[i];
            int temp_last=0x3f3f3f3f;
            for(int j=i+1;j<len;j++){
                int temp=target-nums[j];
                if(hmap.find(temp)!=hmap.end()){
                    res.push_back({nums[i],nums[j],temp});
                }
                else{
                    hmap[nums[j]]=1;
                }
            }
        }
        set<vector<int>> s(res.begin(),res.end());
        res.assign(s.begin(),s.end());
        return res;
    }
};

Python:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        len_nums=len(nums)

        res=[]

        for i in range(len_nums-2):
            if nums[i]>0:
                break
            if i>0 and nums[i]==nums[i-1]:
                continue
            hmap={}
            target=-nums[i]
            temp_last=0x3f3f3f3f
            for j in range(i+1,len_nums):
                temp=target-nums[j]
                if temp in hmap:
                    res.append([nums[i],nums[j],temp])
                else:
                    hmap[nums[j]]=1
        s=set(tuple(x) for x in res)
        res=[list(x) for x in s]
        return res

Python中的去重:

s=set(tuple(x) for x in res)
res=[list(x) for x in s]

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

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

相关文章

kubectl 命令行管理K8S(下)

目录 声明式资源管理方式 介绍 命令 修改yaml文件指定的资源 离线修改 在线修改 YAML 语法格式 查看 api 资源版本标签 编辑yaml配置清单生成资源 编写yaml文件 yaml创建Deployment yaml创建service服务对外提供访问并测试 yaml创建Pod 生成模板 pod模板 serivc…

python和nodejs一键安装当前项目所有依赖

python和nodejs一键安装当前项目所有依赖。群里有人问怎么快速安装网上下载的源码里面的依赖。所以在这里分享一下。更多问题可以自己加群917400262问我。 目录导航 1.0 python一键安装当前项目所有依赖2.0 nodejs一键安装当前项目所有依赖 1.0 python一键安装当前项目所有依赖…

【分块三维重建】【slam】LocalRF:逐步优化的局部辐射场鲁棒视图合成(CVPR 2023)

项目地址&#xff1a;https://localrf.github.io/ 题目&#xff1a;Progressively Optimized Local Radiance Fields for Robust View Synthesis 来源&#xff1a;KAIST、National Taiwan University、Meta 、University of Maryland, College Park 提示&#xff1a;文章用了s…

KubeSphere简介,功能介绍,优势,架构说明及应用场景

KubeSphere 是在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器平台&#xff0c;提供简单易用的操作界面以及向导式操作方式&#xff0c;在降低用户使用容器调度平台学习成本的同时&#xff0c;极大减轻开发、测试、运维的日常工作的复杂度&#xff0c;旨…

腾讯云幻兽帕鲁服务器使用Linux和Windows操作系统的具体性能比较是什么?

腾讯云幻兽帕鲁服务器使用Linux和Windows操作系统的具体性能比较是什么&#xff1f; 首先&#xff0c;从内核效率来看&#xff0c;Linux在同等硬件条件下的性能优于Windows。这是因为Linux内核设计简洁&#xff0c;对服务器工作负载进行了优化&#xff0c;能够更好地利用系统资…

基于springboot+vue的客户关系管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

软考基础知识2

1.DMA控制方式&#xff1a;直接内存存取。数据在内存与I/O设备间直接成块传送&#xff0c;不需要CPU的任何干涉&#xff0c;由DMA硬件直接执行完成。 例题&#xff1a; 2.程序计数器总是存下一个指令的地址。 例题&#xff1a; 3.可靠度的计算&#xff1a; 例题&#xff1a…

【Java项目介绍和界面搭建】拼图小游戏——打乱图片顺序

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

vs报错1168链接错误——关于:LNK1168 无法打开 E:\VS\文件名\x64\Debug\文件名. 进行写入问题的解决方法

关于这个问题我在网上找了一些方法。 有些方法解决了这个问题&#xff0c; 但是有点麻烦&#xff0c; 有些方法可能不能解决问题。 这里我先把我在网上找到的方法写出来&#xff1a; 第一种方法是可能开着一个程序&#xff0c;就是这个终端。有的时候报错1168是因为你没有关这…

2.2_5 调度算法

文章目录 2.2_5 调度算法一、适用于早期的批处理系统&#xff08;一&#xff09;先来先服务&#xff08;FCFS&#xff0c;First Come First Serve&#xff09;&#xff08;二&#xff09;短作业优先&#xff08;SJF&#xff0c;Shortest Job First&#xff09;&#xff08;三&a…

Java中的List

List集合的特有方法 方法介绍 方法名描述void add(int index,E element)在此集合中的指定位置插入指定的元素E remove(int index)删除指定索引处的元素&#xff0c;返回被删除的元素E set(int index,E element)修改指定索引处的元素&#xff0c;返回被修改的元素E get(int inde…

【全局异常处理记录】⭐️通过自定义全局处理器有效统一各种异常并记录

目录 前言 方案 示例 测试 总结 前言 朋友们大家好啊&#xff0c;随着项目的进行&#xff0c;接口也是越来越多了&#xff0c;每个接口无论调用成功与否&#xff0c;都要有相应的应对措施&#xff0c;总不能出错的时候返回一堆异常信息给调用者&#xff0c;所以每个接口都…

MVCC【重点】

参考链接 [1] https://www.bilibili.com/video/BV1YD4y1J7Qq/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source0cb0c5881f5c7d76e7580fbd2f551074 [2]https://www.cnblogs.com/jelly12345/p/14889331.html [3]https://xiaolincoding.com/mysql…

java基础题库详解

目录 1 JDK和JRE有什么区别&#xff1f; 1.1、JRE 1.2、JDK 2、和equals的区别是什么? 3、比较 4、装箱&#xff0c;拆箱 4.1、什么是装箱&#xff1f;什么是拆箱&#xff1f; 4.2、装箱和拆箱的执行过程&#xff1f; 4.3、常见问题 5、hashCode()相同&#xff0c;e…

让ChatGPT给你写代码????

原文链接&#xff1a;使用ChatGPT写代码靠谱吗&#xff1f; 写在前面 对于ChatGPT从我们“惊讶”到现在已经快一年多了&#xff0c;但是&#xff0c;对于个人来说&#xff0c;使用还是比较少的。更确切的来说&#xff0c;也许有些同学是没有使用过。 ChatGPT功能确实比较强大…

【latex】\IEEEpubid版权声明与正文内容重叠

问题描述 撰写IEEE Trans论文时&#xff0c;出现版权声明文字\IEEEpubid与正文内容重叠的问题&#xff1a; 原因分析&#xff1a; 在使用模板时&#xff0c;不小心将以下命令删除了&#xff1a; \IEEEpubidadjcol 解决方案&#xff1a; 在需要换页的位置附近添加以上命令&…

Spring Cloud Nacos集成Seata2.0 AT模式

Spring Cloud Nacos集成Seata2.0 AT模式 以CentOS 7为例&#xff0c;介绍Spring Cloud Nacos集成Seata2.0 AT模式的流程。分成两个步骤&#xff1a;1.安装配置seata-server、2.项目集成seata-client 一、下载seata-server安装包 根据自己的操作系统选择要下载的安装包格式&a…

计算机指令、指令跳转原理

文章目录 前言存储程序型计算机代码怎么变成机器码&#xff1f;解析指令和机器码CPU 是如何执行指令的&#xff1f;CPU中的寄存器 if…else 来看程序的执行和跳转分析 通过 if…else 和 goto 来实现循环 前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第三篇…

【漏洞复现】某厂商上网行为管理系统static_convert命令执行漏洞

Nx01 产品简介 天融信上网行为管理系统是天融信公司凭借多年来的安全产品研发经验&#xff0c;为满足各行各业进行网络行为管理和内容审计的专业产品。 Nx02 漏洞描述 天融信上网行为管理系统老版本static_convert.php接口存在RCE漏洞&#xff0c;攻击者利用此漏洞可以获取服务…

贪心(基础算法)--- 区间选点

905. 区间选点 思路 &#xff08;贪心&#xff09;O(nlogn) 根据右端点排序 将区间按右端点排序 遍历区间&#xff0c;如果当前区间左端点不包含在前一个区间中&#xff0c;则选取新区间&#xff0c;所选点个数加1&#xff0c;更新当前区间右端点。如果包含&#xff0c;则跳…