算法综合篇专题一:双指针问题

news2024/11/17 3:31:49

"就算没有看清那株灿烂的花蕊,也应该放声歌颂赞美鲜红的玫瑰" 


1、移动零

(1) 题目解析        

(2) 算法原理      

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int cur=0,dest=-1;cur<nums.size();++cur)
        {
            if(nums[cur]) swap(nums[cur],nums[++dest]);
        }
    }
};

2、复写零

(1) 题目解析        

(2) 算法原理                 

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        // 1.找到最后一个下标位置
        int cur = 0;
        int dest = -1;
        int n = arr.size();
        while(dest < n)
        {
            if(arr[cur]) dest++;
            else dest += 2;
            // dest走到边界
            if(dest >= n-1) break;
            cur++;
        }

        // 处理边界存在最后一个数为0
        if(dest == n)
        {
            arr[n-1] = 0;
            cur--,dest-=2;
        }

        while(cur >= 0)
        {
            if(arr[cur])  arr[dest--] = arr[cur--];
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }
};


3、快乐数 

(1) 题目解析

(2) 算法原理        

class Solution {
public:
    int bitSum(int n)
    {
        int sum = 0;
        while(n)
        {
            int a = n % 10;
            sum += pow(a,2);
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        // 快慢指针
        int slow = n,fast = bitSum(n);
        while(slow != fast)
        {
            slow = bitSum(slow);
            fast = bitSum(bitSum(fast));
        }

        return slow == 1 ? true : false;
    }
};

4、盛最多水的容器 

(1) 题目解析        

(2) 算法原理        

class Solution {
public:
    int maxArea(vector<int>& arr) {
        int n = arr.size();
        int left=0,right=n-1;
        int ret = 0;
        while(left < right)
        {
            int height = min(arr[right],arr[left]);
            int v = (right-left) * height;
            ret = max(ret,v);
            
            height == arr[right] ? right--:left++;
        } 
        return ret;
    }
};


5、有效三角)——形个数

(1) 题目解析        

(2) 算法原理        

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(),nums.end());
        int num = 0;
        for(int c=nums.size()-1;c>=2;--c)
        {
            int left = 0;
            int right = c-1;
            while(left < right)
            {
                int sum = nums[left] + nums[right];
                if(sum > nums[c])
                {
                    num += (right-left);
                    right--;
                }
                else left++;
            }
        }

        return num;
    }
};

6、和为s的两个数

(1) 题目解析

(2) 算法原理

        

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0,right=n-1;
        while(left < right)
        {
            int sum = nums[left]+ nums[right];
            if(sum > target){
                right--;
            }
            else if(sum < target){
                left++;
            }
            else return {nums[left],nums[right]};
        }

        return {-1};
    }
};

   


7、三数之和

(1) 题目解析        

(2) 算法原理

        

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> res;
        sort(nums.begin(),nums.end());
        for(int i=0;i<n;)
        {
            if(nums[i] > 0) break;
            int left = i+1,right = n-1;
            while(left < right)
            {
                int tar = -nums[i];
                int sum = nums[left] + nums[right];
                if(sum > tar) right--;
                else if(sum < tar) left++;
                else
                {
                    res.push_back({nums[i],nums[left],nums[right]});
                    left++,right--;

                    // 区间数比较
                    while(left <right && nums[left] == nums[left-1]) left++;

                    while(left < right && nums[right] == nums[right+1] ) right--;
                }
            }

            // 固定数比较
            i++;
            while(i < n && nums[i] == nums[i-1]) i++;
        }
        return res;
    }
};


8、四数之和

(1) 题目解析

        这道题的本质和三数之和没什么区别,只不过比三数字和多套一层循环就能够解决了。所以不再细讲,注意到各个循环内的越界去重问题就行。

(2) 算法原理     

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        int n = nums.size();
        // 排序
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        for(int i=0;i<n;)
        {
            for(int j=i+1;j<n;)
            {
                int left =j+1,right=n-1;
                while(left < right)
                {
                    // 固定两个数
                    // 可能出现溢出情况
                    long long tar = (long long)target - nums[i] - nums[j];
                    int sum = nums[left] + nums[right];
                    if(sum > tar) right--;
                    else if(sum < tar) left++;
                    else 
                    {
                        res.push_back({nums[i],nums[j],nums[left],nums[right]});
                        left++,right--;

                        while(left < right && nums[left] == nums[left-1]) left++;
                        while(left < right && nums[right] == nums[right+1]) right--;
                    }
                }

                j++;
                while(j < n && nums[j] == nums[j-1]) j++;
            }
            i++;
            while(i < n && nums[i] == nums[i-1]) i++;
        }

        return res;
    }
};


本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~


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

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

相关文章

【Unity造轮子】实现一个类csgo的武器轮盘功能

文章目录 前言素材导入开始1.放背景和中间的圆圈&#xff0c;调整合适的宽高和位置2.添加选择图像框3.添加一些武器道具选择4.书写脚本RadialMenuManager5.绑定脚本和对象6.运行效果&#xff0c;按tab键开启关闭轮盘7.优化添加显示选中的武器文本8.添加鼠标选中放大的效果9.添加…

ModaHub魔搭社区:国产大模型名录和产品信息一览表114个

取名类型 公司名 大模型名字 序号 旧词新组 百度 文心一言 1 阿里 通义千问 2 知乎 知海图 3 云知声 山海 4 中国科学院计算技术研究所 百聆

算法通过村第二关-链表青铜笔记

文章目录 再战链表|反转链表剑指 Offer II 024. 反转链表熟练掌握这两种解法建立头节点的解决思路不采用建立头节点的方法采用循环/递归的方式解决 总结 再战链表|反转链表 提示&#xff1a;多拿些酒来&#xff0c;因为生命只有乌有。 剑指 Offer II 024. 反转链表 如果不使用…

Excel修改日期格式,改变日期的筛选方式

我们有两列日期数据&#xff1a; 左边这一列筛选会显示&#xff1a; 右边这一列筛选会显示&#xff1a; 修改格式&#xff0c;将【日期1】改为【日期2】 将【日期1】的格式修改为文本格式即可 修改格式&#xff0c;将【日期2】改为【日期1】 选中日期2&#xff0c;点击【数据…

实用调试技巧(1)

什么是bug&#xff1f;调试是什么&#xff1f;有多重要&#xff1f;debug和release的介绍。windows环境调试介绍。一些调试的实例。如何写出好&#xff08;易于调试&#xff09;的代码。编程常见的错误。 什么是Bug 我们在写代码的时候遇到的一些问题而导致程序出问题的就是Bu…

C语言——函数栈帧的创建和销毁

Hello&#xff0c;好久没有写博客了&#xff0c;前两份都是之前写的&#xff0c;看来最近有点懈怠&#xff0c;最近也得快点找回学习的状态&#xff0c;那今天开始我们新的讲解 在我们刚开始学习C语言的时候&#xff0c;不知道大家有没有困惑&#xff0c;比如我们在使用局部变量…

vue 表单form-item模板(编辑,查看,新建)

目录 formatFormData 后端数据格式​编辑 JSON解析和生成 加载&#xff08;请求前&#xff0c;await后&#xff09; formComp formatFormData 后端数据格式 为空的&#xff0c;可以直接不提交/提交null/undefined JSON解析和生成 var str {"name": "…

ERROR: No matching distribution found for wxpyhton

ERROR: No matching distribution found for wxpyhton pip install 库包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.compip install wxpython -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

Voicebox:文本引导的大规模多语言通用语音生成

说白了就是录一段你的声音&#xff0c;在最短的时间内学会你说话&#xff01; Meta AI研究团队模型&#xff0c;Voicebox是一个文本转语音的工具&#xff0c;具有多种功能和应用。根据提供的搜索结果&#xff0c;以下是Voicebox的一些功能和特点&#xff1a; 多语言支持&…

语义分割、转置卷积、风格迁移(第十二次组会)

TOC 语义分割 图像分割、实例分割 上采样、下采样 转置卷积 全卷积网络 风格迁移

操作系统_进程与线程(四)

目录 4. 死锁 4.1 死锁的概念 4.1.1 死锁的定义 4.1.2 死锁产生的原因 4.1.3 死锁的处理策略 4.2 死锁预防 4.3 死锁避免 4.3.1 系统安全状态 4.3.2 银行家算法 4.3.2.1 数据结构描述 4.3.2.2 银行家算法描述 4.3.2.3 安全性算法 4.3.3 安全性算法举例 4.3.4 银行…

【EI/SCOPUS会议征稿】第三届物联网与机器学习国际学术会议(IoTML 2023)

第三届物联网与机器学习国际学术会议&#xff08;IoTML 2023&#xff09; 2023 3rd International Conference on Internet of Things and Machine Learning 2023年物联网与机器学习国际学术会议&#xff08;IoTML 2023&#xff09;将于2023年9月15-17日在新加坡召开。会议…

安装华为模拟器

安装前需要安装虚拟机 虚拟机安装 下一步 立即安装 安装驱动 完成 一路下一步 安装完成后拖动一个2240启动

【Liux下6818开发板(ARM)】实现简易相册

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

Linux NameSpace 虚拟化 资源隔离

NameSpace NameSpace介绍 在操作系统中命名空间命名空间提供的是系统资源的隔离&#xff0c;其中系统资源包括了&#xff1a;进程、网络、文件系统等等 实际上linux系统实现命名空间主要目的之一就是为了实现轻量级虚拟化服务&#xff0c;也就是我们说的容器&#xff0c;在同…

分享一个赛车动画

先看效果&#xff08;动画太大了放不上来&#xff0c;甘心去复制代码运行即可&#xff09;&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>赛车</title><…

AD21 PCB设计的高级应用(六)极坐标的应用

&#xff08;六&#xff09;极坐标的应用 在 PCB 设计过程中,特别是 LED圆形灯板的 PCB 设计,需要对 LED灯珠进行圆形等间距排列,如果每个元件都计算清楚其坐标再进行放置会非常烦琐。要实现如图 所示的元件布局效果,在 Altium Designer 软件里可以使用极坐标的方法。 (1)打开…

Vue2 第十一节 Vue的生命周期

1.生命周期的概念 2.生命周期流程图 3.生命周期分析 一.生命周期概念 生命周期又称为生命周期回调函数&#xff0c;生命周期函数&#xff0c;生命周期钩子是Vue在关键时刻帮我们调用的一些特殊名称的函数生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根…

【低代码开发】:加速应用开发的未来趋势

低代码开发&#xff1a;加速应用开发的未来趋势 引言什么是低代码以及功能特点&#xff1f;什么是低代码开发&#xff1f;低代码平台的特点和功能低代码平台的应用场景和优势低代码的优点低代码的缺点低代码平台项目开发流程选择和实施低代码平台 低代码未来的发展趋势低代码平…

MyBatis缓存-提高检索效率的利器--一级缓存

&#x1f600;前言 本篇博文是关于MyBatis一级缓存的介绍使用和缓存失效情况分析&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家…