当前位置: 首页 > news >正文

Leetcode 15 -- 双指针

题目描述

三数之和

思路

参考

先不考虑重复的问题。从暴力出发,我们需要使用三重循环,会超速。
对于数组循环的优化问题,双指针很常用。
双指针(又称为快慢指针)可以将一个二重循环优化为一重,因此我们可以用双指针优化。
我们可以以此枚举每一个点作为第一个数,从后面寻找第二个和第三个数。

关于去重:

首先不管三七二十一,先排序!
首先要知道,什么时候会发生重复!
参考回溯中树层去重的例子,当一个集合的子集相同的时候,后面就可能出现重复。
因此,我们的目标是消除重复的子集。
这和树层去重基本类似:if(i > 0 && nums[i] == nums[i - 1]) continue
当一个数和前一个数相同的时候,如果前一个数没有选,我们说此时子集重复了。但这里我们并没有判断前一个数有没有选。
这是因为不需要判断,因为当前的nums[i]是起点,之前的数肯定没选。

代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        if(n < 3)   return {};

        sort(nums.begin(), nums.end());
        // for(auto &x : nums) cout << x << ' ';
        cout << endl;
        vector<vector<int>> res;

        for(int i = 0; i < n; i ++ ) {
            if(nums[i] > 0) break;
            if(i > 0 && nums[i] == nums[i - 1]) continue; // 子集:{x..},{x..}

            int l = i + 1, r = n - 1;
            while(l < r) { // 不能 l<=r, 否则他们就是同一个数,而我们需要两个数
                if(nums[l] + nums[r] + nums[i] > 0)    {
                    while(r > l && nums[l] + nums[r] + nums[i] > 0)  r -- ;
                }
                else if(nums[l] + nums[r] + nums[i] < 0) {
                    while(r > l && nums[l] + nums[r] + nums[i] < 0)  l ++ ;
                }   
                else { //if(nums[l] + nums[r] + nums[i] == 0) 
                    res.push_back(vector<int>{nums[i], nums[l], nums[r]});
                    l ++ , r -- ;
                    while(l < r && nums[l] == nums[l - 1])   l ++ ; // 子集:{x,y,z},{x,y,z},y重复
                    while(l < r && nums[r] == nums[r + 1])   r -- ; // 子集:{x,y,z},{x,y,z},z重复
                }
            }
        }

        return res;
    }
};
http://www.dtcms.com/a/111973.html

相关文章:

  • Mysql 中的 MyISAM 引擎
  • 第十五届蓝桥杯单片机省赛程序设计试题
  • CSS 3D变换,transform:translateZ()
  • 从小米汽车事故反思 LabVIEW 开发
  • 专业的情商测评工具:EQ-i在线测评系统
  • Fastjson 处理 JSON 生成与解析指南
  • 31--当认证协议开始“选秀“:RADIUS、LDAP、AD与本地认证的C位之争
  • react redux的学习,多个reducer
  • drawio导出流程图为白色背景png图片
  • 对OSPF协议的LSA分析
  • Linux系统进程
  • AI 浪潮下企业身份管理:特点凸显,安全挑战升级
  • CMake学习-- install 指令详细说明
  • 11.多线程-信号量-线程池
  • AWS 云运维管理指南
  • ekf-imu --- 四元数乘法符号 ⊗ 的含义
  • SQLite 触发器
  • 深入解析CPU主要参数:选购与性能评估指南
  • ngx_alloc
  • 【2022】【论文笔记】基于相变材料的光学激活的、用于THz光束操作的编码超表面——
  • leetcode-代码随想录-哈希表-有效的字母异位词
  • 2007-2019年各省地方财政交通运输支出数据
  • 动物多导生理信号采集分析系统技术简析
  • 分治算法的使用条件
  • 页面简单传参
  • 【Linux】条件变量封装类及环形队列的实现
  • mybatis慢sql无所遁形
  • 学透Spring Boot — 009. Spring Boot的四种 Http 客户端
  • 科技赋能安居梦:中建海龙以模块化革新重塑城市更新范式
  • 多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测