『 基础算法题解 』之双指针(下)

news2024/11/16 9:35:50

文章目录

    • 和为S的两个数
      • 题目解析
      • 算法原理
      • 代码
    • 三数之和
      • 题目解析
      • 算法原理
      • 代码
    • 四数之和
      • 题目解析
      • 算法原理
      • 代码

和为S的两个数

题目解析

【题目链接】

该题目的原题为和为s的两个数:

即给定一组升序数据(数组price),并给出一个变量target,要求找出和为target的两个数;


算法原理

  • 暴力枚举

    暴力枚举顾名思义就是暴力解法,使用两个for循环枚举出所有的可能并做出判断;

    for(i)
    {
        for(j)
        {
        	check(i+j==target?)    
        }
    }
    
  • 双指针

    该双指针的解法即为创建两个指针分别为leftright分别指向0price.size()-1的位置;

    由于数据已经是升序已经具有单调性,所以不需要再进行排序;

    left+right每次的结果sum共有三种可能性:

    1. sum>target;
    2. sum<target
    3. sum==target

    若是sum>target则表示right数据较大,应该--right;

    若是sum<target则表示left数据较小,应该++left;

    否则则相等,返回对应的leftright所对应的值;


代码

  • 双指针

    class Solution {
    public:
        vector<int> twoSum(vector<int>& price, int target) {
    
            int first = 0;
            int last = price.size()-1;
            while(first<last){
                if(price[first]+price[last]>target) --last;
                else if(price[first]+price[last]<target) ++first;
                else return {price[first],price[last]};
            }
            return {1,2};
        }
    };
    



三数之和

题目解析

【题目链接】

本题的关键信息:

  • a,b,c三数之和为0;

  • 不重复的三元组

    以示例1为例,三元组为[-1,0,1],[-1,0,1],[-1,-1,2];

    但最终答案为[[-1,0,1],[-1,-1,2]];


算法原理

  • 双指针

    该算法原理可以参考上一题和为S的两个数,具体的思路为将数组首先进行一次排序使其具有单调性;

    再通过和为S的两个数的思路进行;

    具体为:

    1. 固定好一个数据(最左),在该数据的右侧区间内找到和为该数的相反数的两个数;

    2. 由于需要找到数组中所有这样的数据,所以在找到一组数据后应该继续找;

    同时在该题中应该要特别注意一个细节:

    • 去重

    该数据中返回的所有三元组和都将是不重复的,具体的去重方法有两种:

    1. 使用unordered_set容器进行去重;

    2. 控制指针,当指针所指数据与上一位置数据相同则会出现三元组重复的可能;

      所以分别控制cur,lefy,right指针即可;

    小优化:由于数据经排序后已经具有单调性,所以当cur所指位置数据>0时,则代表cur后区间的数据中已经不满足三数之和>0,所以cur所指位置数据>0时,可以直接跳出循环;


代码

  • 双指针
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ret;
        sort(nums.begin(),nums.end());//排序使数组具有单调性

        int len = nums.size();
        int cur = 0;
        
        while(cur<nums.size()){//固定一个数据
            if(nums[cur]>0) break;//当cur数据>0时则表示该指针后的区间不存在符合条件的三元组
            //定义变量
            int left = cur+1;//left指针所在数据为cur指针后一个位置
            int right = nums.size()-1;
            
            int targe = -nums[cur];//变量targe用于存储cur所指数据的相反数,用来与左右数据之和进行比较

            while(left < right){
                int sum = nums[left] + nums[right];
                if(sum > targe) --right;
                else if(sum < targe) ++left;
                else{
                    ret.push_back({nums[cur],nums[left],nums[right]});
                    ++left,--right;//存入一组数据之后应该继续遍历
                    
                    //对left,right指针进行去重
                    while(left<right && nums[left-1] == nums[left]) ++left;
                    while(left<right && nums[right+1] == nums[right]) --right;
                }
            }
            
            ++cur;
            while(cur<nums.size()&&nums[cur] == nums[cur-1]) ++cur;//对cur进行去重
        }
        return ret;
    }
};



四数之和

题目解析

【题目链接】


算法原理

  • 双指针

    该题的双指针的思路与三数之和题目大差不差,与之不同的是多一层循环用来固定双指针外的另一个数;


代码

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());//排序使其具有单调性

        vector<vector<int>> ret;
        int len = nums.size();
        for(int i = 0;i<len;){
            for(int j = i+1;j<len;){

                int left = j + 1;
                int right = len - 1;
                long long tmp = (long long)target - nums[i] - nums[j];//long long类型为对测试用例的进行特殊处理
                while(left<right){
                    
                    int sum = nums[left]+nums[right];
                    if(sum>tmp) right--;
                    else if(sum<tmp) left++;
                    else {
                        ret.push_back({nums[left],nums[right],nums[i],nums[j]});
                        left++,right--;//继续遍历
                        
                        //去重左右
                        while(left<right && nums[left] == nums[left-1]) ++left;
                        while(left<right && nums[right] == nums[right+1]) --right;
                    }
                }
                //指针j的去重
                ++j;
                while(j<len&&nums[j] == nums[j-1]) ++j;
            }
            //指针i的去重
            ++i;
            while(i<len&&nums[i] == nums[i-1]) ++i;
        }
        return ret;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第4关:书籍排序

题目&#xff1a; C&C结构体 (educoder.net) 思路&#xff1a; 1.字符串字典序排序---> 利用string.h里面的strcmp&#xff0c;由其返回值确定两字符串大小。&#xff08;pstrcmp(a,b)&#xff0c;若p>1&#xff0c;则a字典序大于b。&#xff09; 2.当不能定义字…

Java练习题2021-1

"从大于等于N的正整数里找到一个最小的数M&#xff0c;使之满足&#xff1a; M和M的逆序数&#xff08;如1230的逆序数为321&#xff09;的差的绝对值为一个[100000,200000]区间内的值。 输入说明&#xff1a;起始数字N&#xff1b; 输出说明&#xff1a;找到的第一个符合…

Java实现Excel导入和导出,看这一篇就够了(珍藏版2.0)

1. 前言 两年前&#xff0c;我发表了一篇自己基于POI实现的工具类 Java实现Excel导入和导出&#xff0c;看这一篇就够了(珍藏版)&#xff0c;也就是1.0版本&#xff0c;受到了不少粉丝和朋友喜欢&#xff0c;谢谢大家认可。在这两年多的时间里&#xff0c;经过粉丝们的建议&am…

0基础学习PyFlink——用户自定义函数之UDTAF

大纲 UDTAFTableAggregateFunction的实现累加器定义创建累加 返回类型计算 完整代码 在前面几篇文章中&#xff0c;我们分别介绍了UDF、UDTF和UDAF这三种用户自定义函数。本节我们将介绍最后一种函数&#xff1a;UDTAF——用户自定义表值聚合函数。 UDTAF UDTAF函数即具备了…

归一化一维时序信号,针对上下幅值波动不均问题

目的&#xff1a;如下图&#xff0c;信号上包络和下包络都有无规律的起伏&#xff0c;如何进行有效归一化&#xff0c;步骤如下&#xff1a; 步骤1. 信号初步归一化 data mapminmax(data,-1,1); 步骤2. 希尔伯特变换获得该时序信号的包络 z hilbert(data);figure;plot(data…

【VUE】ArcoDesign之自定义主题样式和命名空间

前言 Arco Design是什么&#xff1f; Arco Design 是由字节跳动推出的企业级产品的完整设计和开发解决方案前端组件库 官网地址&#xff1a;https://arco.design/同时也提供了一套开箱即用的中后台前端解决方案&#xff1a;Arco Design Pro(https://pro.arco.design/) Arco De…

基于SSM的高校勤工助学系统

基于SSM的高校勤工助学系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 管理员界面 摘要 基于SSM&#xff08;Spring、SpringMVC、MyBatis&#xff…

560. 和为 K 的子数组(前缀和 + 哈希表)

这道题的思路就是&#xff1a; 前缀和的差值可以表示一个区间内的元素的总和。 所以index1处的前缀和如果为sum&#xff0c;那么前面只要出现过 k - sum 的前缀和就表示&#xff0c;有和为k的子数组存在。 因为&#xff0c;sum - &#xff08;sum - k&#xff09; k class Sol…

ATFX汇市:美国9月PCE数据来袭,高通胀问题或已不构成威胁

ATFX汇市&#xff1a;今日20:30&#xff0c;美国商务部将公布9月核心PCE物价指数年率&#xff0c;前值为3.9%&#xff0c;金融机构预期为3.7%&#xff0c;预期将出现小幅下降。核心PCE数据与核心CPI数据的走势共振性较强&#xff0c;9月份核心CPI数据显示&#xff0c;最新值4.1…

【机器学习可解释性】3.部分依赖图

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP Value5.SHAP Value 高级使用 正文 每个特征怎么样影响预测结果&#xff1f; 部分依赖图 Partial Dependence Plots 虽然特征重要性显示了哪些变量对预测影响最大&#xff0c;但部分依赖图显示了特征如…

CorelDRAW和AI哪个更好用?

设计软件市场中&#xff0c;CorelDRAW和Adobe Illustrator&#xff08;简称AI&#xff09;无疑是两大重量级选手。它们各自拥有庞大的用户群和丰富的功能&#xff0c;但究竟哪一个更好用&#xff1f;本文将从多个角度出发&#xff0c;对这两款软件进行全面而深入的比较&#xf…

mysql基本操作命令

1、数据库的分类 mysql&#xff1a;关系型数据库 redis&#xff1a;非关系型数据库 关系型数据库&#xff1a;存储数据的结构是一个二维表格 表&#xff1a;行 列 行&#xff1a;记录&#xff0c;用来描述一个对象的信息 列&#xff1a;字段&#xff0c;用来描述对象的一个…

基于SSM的二手车交易系统

基于SSM的二手车交易系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 摘要 基于SSM&#xff08;Spring、SpringMVC、MyBatis&a…

高效管理文件夹名称:如何批量修改指定多样化的文件夹名称

在文件管理工作中&#xff0c;文件夹名称的管理对于整体的文件管理体系有着至关重要的作用。然而&#xff0c;往往我们会在文件夹名称的管理上遇到一些难题&#xff0c;如&#xff1a;需要修改的文件夹名称多样化&#xff0c;无法一次性满足所有需求。为了解决这个问题&#xf…

米尔AM62x核心板助力新一代工业4.0升级

米尔AM62x核心板 续写AM335x经典 在过去的十几年中&#xff0c;TI Sitara系列推出了很多优秀的处理器&#xff0c;其中在工业、电力、医疗等领域有着广泛应用的AM335x系列处理器&#xff0c;引领工业市场从MCU向MPU演进&#xff0c;帮助产业界从ARM9迅速迁移至高性能Cortex-A…

796. 子矩阵的和(二维前缀和)

题目&#xff1a; 796. 子矩阵的和 - AcWing题库 思路&#xff1a; 1.暴力搜索&#xff08;搜索时间复杂度为O(n2)&#xff0c;很多时候会超时&#xff09; 2. 前缀和&#xff08;左上角&#xff08;二维&#xff09;前缀和&#xff09;&#xff1a;本题特殊在不是直接求前…

软考系统架构师知识点集锦五:系统可靠性分析与设计

一、考情分析 二、考点精讲 2.1相关基本概念 可靠性:可靠性是软件系统在应用或系统错误面前&#xff0c;在意外或错误使用的情况下维持软件系统的功能特性的基本能力。 可用性:可用性是系统能够正常运行的时间比例。 软件可靠性 ≠ 硬件可靠性 软硬件对比 复杂性:软件复杂性比…

linux下部署nacos(单机、集群)

文章目录 nacos简介单机部署集群部署部署常见问题 官网文档地址&#xff1a;https://nacos.io/zh-cn/docs/deployment.html github地址&#xff1a;https://github.com/alibaba/nacos nacos简介 Nacos&#xff0c;全称阿里巴巴开源的动态服务发现、配置和服务管理平台&#x…

【springBoot】博客系统

SSM版本的博客系统 1. 项目亮点 使用MD5加盐算法进行密码的加密使用Redis持久化存储Session使用拦截器验证用户登录 2. 项目创建 1.项目框架的选择 2. 项目依赖的引入 3. 静态页面的代码文件&#xff1a; program/博客系统(静态页面).rar 叁伍/java语言练习 - 码云 - 开源…

电脑msvcp100.dll丢失了怎么办?详细的5个修复方法

电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;由于各种原因&#xff0c;其中最常见的就是“缺少xxx.dll文件”&#xff0c;而msvcp100.dll就是其中之一。那么&#xff0c;msvcp100.dll到底是什么&#xff1f;当我们遇到这个问题时&#xff0c;应该如何解决呢…