算法专题一:双指针

news2024/11/29 6:31:33

算法专题一:双指针

  • 一:移动零
    • 1.GIF题目解析:
  • 二:复写零
    • 2.GIF题目解析:
  • 三:快乐数
    • 3.GIF题目解析:
  • 四:装水最多容器:
    • 4.GIF题目解析:
  • 五:有效三角形的个数:
    • 5.GIF题目解析:
  • 六:查找总价格为目标价格的两个商品:
    • 6.GIF题目解析:
  • 七:三数之和:
    • 7.GIF题目解析:
  • 八:四数之和:
    • 8.GIF题目解析:

一:移动零

在这里插入图片描述
移动零

1.GIF题目解析:

在这里插入图片描述

在这里插入图片描述

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

二:复写零

在这里插入图片描述
复写零

2.GIF题目解析:

情况一:
在这里插入图片描述

情况二

在这里插入图片描述

在这里插入图片描述

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {

        int cur = 0;
        int des = -1;
        int n = arr.size();

        //1.找到cur和des位置:

        while (cur<n)
        {
            if (arr[cur] != 0)
            {
                des++;
            }
            else if (arr[cur] == 0)
            {
                des += 2;
            }
            if (des >= n - 1)
            {
                break;
            }
            cur++;
        }


        //2.判断特殊情况:
        if (des == n)
        {
            arr[n-1] = 0;
            cur--;
            des-=2;
        }

        //3.进行复写操作:

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

三:快乐数

在这里插入图片描述
快乐数

3.GIF题目解析:

在这里插入图片描述

class Solution {
public:
    int sum_of_squares(int n)
    {
        int sum = 0;
        while(n!=0)
        {
            int tmp = n%10;
            sum += (tmp*tmp);
            n/=10;
        }
        return sum;
    }

    bool isHappy(int n) {
        int slow = n;
        int falst = sum_of_squares(n);

        while(slow!=falst)
        {
            slow = sum_of_squares(slow);
            falst = sum_of_squares(sum_of_squares(falst));
        }

        return slow==1;
    }
};

四:装水最多容器:

在这里插入图片描述

4.GIF题目解析:

在这里插入图片描述

class Solution {
public:
    int maxArea(vector<int>& height) {
        int front = 0;
        int last = height.size()-1;

        int capacity = 0;
        while(front<=last)
        {
            int cap = (min(height[last] , height[front]))*(last-front);

            if(cap>=capacity)
            {
                capacity = cap;
            }

            if(height[front]>=height[last])
            {
                last--;
            }
            else if(height[front]<height[last])
            {
                front++;
            }
        }

        return capacity;
    }
};

五:有效三角形的个数:

在这里插入图片描述
有效三角形的个数

思路一:暴力解法:
1.满足三角形的条件是任意两边之和大于第三边:
2.题目不允许同一个位置的元素重复出现:
3.因为只需要拿出三个数所以循环遍历三次:
4.三角形条件的判断需要判断三次:
5.时间复杂度就是O(3*N^3)

思路二:排序+双指针

在这里插入图片描述

5.GIF题目解析:

在这里插入图片描述

class Solution {
public:
    int triangleNumber(vector<int>& nums) {

        //1.排序
        sort(nums.begin(),nums.end());

        //2.固定最大的数:
        int count =0;

        for(int i=nums.size()-1;i>=2;i--)
        {
            int left = 0;
            int right = i-1;

            while(left<right)
            {
                int sum = nums[left]+nums[right];

                if(sum > nums[i])
                {
                    count+=(right-left);
                    right--;
                }
                else if(sum <= nums[i])
                {
                    left++;
                }
            }
        }
        return count;
    }
};

六:查找总价格为目标价格的两个商品:

在这里插入图片描述

查找总价格为目标价格的两个商品

思路一:暴力解法:
1.双for循环可以重复遇到满足情况的值就返回:
2.双for的i和j price[i]+price[j] == target

思路二:排序+双指针
在这里插入图片描述

6.GIF题目解析:

在这里插入图片描述

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) {
        //1.排序:
        sort(price.begin(),price.end());
        //2.确定指针位置和三种情况:
        int left=0;
        int right = price.size()-1;

        while(left<right)
        {
            int sum = price[left]+price[right];

            if(sum > target)
            {
                right--;
            }
            else if(sum<target)
            {
                left++;
            }
            else 
            {
                return {price[left],price[right]};
            }
        }
        return {-1,-1};
    }
};

七:三数之和:

在这里插入图片描述
三数之和

在这里插入图片描述
在这里插入图片描述

class Solution {
    bool pwd(vector<int>& v1,vector<vector<int>>& vv)
    {
        int flag = vv.size();

        for(int i=0;i<vv.size();i++)
        {
            vector<int> v2=vv[i];

            for(int i=0;i<3;i++)
            {
                if(v1[i]!=v2[i])
                {
                    flag--;
                    break;
                }
            }
        }

        if(flag == 0)
        {
            return false;
        }
        else 
        {
            return true;
        }
    }
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> vv;
        for(int i=0;i<nums.size();i++)
        {
            for(int j=i+1;j<nums.size();j++)
            {
                for(int k=j+1;k<nums.size();k++)
                {
                    int sum = nums[i]+nums[j]+nums[k];
                    vector<int> tmp ={nums[i] , nums[j] ,nums[k]};
                    //1.排序:
                    sort(tmp.begin(),tmp.end());

                    if(sum==0)
                    {
                        //2.判断是否重复:
                        if(vv.size()==0)
                        {
                            vv.push_back(tmp);
                            continue;
                        }
                        else if(!pwd(tmp,vv))
                        {
                            vv.push_back(tmp);
                        }
                    }
                    
                }
            }
        }
        return vv;
    }
};

在这里插入图片描述

7.GIF题目解析:

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {

        vector<vector<int>> vv;
        //1.排序:
        sort(nums.begin(), nums.end());
        //2.遍历固定一个
        if ((nums.size() == 3) && (nums[0] + nums[1] + nums[2] == 0))
        {
            vv.push_back(nums);
            return vv;
        }

        for (int i = 0; i <nums.size();)
        {
            int des = -(nums[i]);

            if(nums[i] > 0)
                break;

            int left = i+1;
            int right = nums.size()-1;

                while (left < right)
                {
                    int sum = nums[left] + nums[right];

                    if (sum > des && right >= 0)
                    {
                        right--;
                    }
                    else if (sum < des && left < nums.size())
                    {
                        left++;
                    }
                    else
                    {
                        vector<int> tmp = { nums[left],nums[right],nums[i] };
                        vv.push_back(tmp);

                        left++;
                        right--;

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

                i++;
                while(i<nums.size() && nums[i]==nums[i-1])
                i++;
            }

            return vv;
        }
};

八:四数之和:

在这里插入图片描述
四数之和

在这里插入图片描述

8.GIF题目解析:

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {

        //1.排序:
        sort(nums.begin(),nums.end());

        //2.记录数据个数:
        int n=nums.size();
        vector<vector<int>> vv;
        //3.开始遍历:

        //情况一:
        
        //特殊优化!
        if(nums[0]>target && nums[0]>0)
            return vv;

        //情况二:
        for(int i=0;i<n;)
        {
            for(int j=i+1;j<n;)
            {
                int left=j+1;
                int right = n-1;

                long long   sum_1 = ((long long)target - 
                (long long)(nums[i] + nums[j]));

                while(left<right)
                {
                    long long  sum_2 = nums[left]+nums[right];

                    if(sum_2 > sum_1)
                    {
                        right--;
                    }
                    else if(sum_2 < sum_1)
                    {
                        left++;
                    }
                    else
                    {
                        vector<int> tmp={nums[i],nums[j],nums[left],nums[right]};
                        vv.push_back(tmp);
                        right--;
                        left++;

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

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

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

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

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

相关文章

知识产权服务企业网站建设效果如何

知识产权服务也有较高的市场需求度&#xff0c;尤其如今互联网深入到各个行业&#xff0c;无论个人还是企业都会以不同的方式经营&#xff0c;相应的为保障自身权益&#xff0c;注册商标、专利等自然不可少&#xff0c;而对普通小白来说&#xff0c;想要完成这些流程也是有些难…

NSSCTF-Crypto靶场练习--第11-20题wp

文章目录 [SWPUCTF 2021 新生赛]traditional[LitCTF 2023]梦想是红色的 (初级)[SWPUCTF 2021 新生赛]crypto2[羊城杯 2021]Bigrsa[LitCTF 2023]Hex&#xff1f;Hex&#xff01;(初级)[SWPU 2020]happy[AFCTF 2018]BASE[安洵杯 2019]JustBase[鹤城杯 2021]Crazy_Rsa_Tech[SWPUCT…

mybatisPlus框架

1、特性 无侵入 &#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑 损耗小 &#xff1a;启动即会自动注入基本 CURD &#xff0c;性能基本无损耗&#xff0c;直接面向对象操作 强大的 CRUD 操作 &#xff1a;内置通用 Mapper 、…

Oracle(2-12)User-Managed Complete Recovery

文章目录 一、基础知识1、Media Recovery 介质恢复2、Recovery Steps 恢复步骤3、恢复4、Recovery in ARCHIVELOG 在ARCHIVELOG中恢复5、Complete Recovery完全恢复6、CR in ARCHIVELOG Mode 归档日志模式下的完全恢复7、Determine Files Need Recovery确定需要恢复的文件8、Ab…

JDK8新特性:Lambda表达式规则及用法,方法引用

目录 Lambda表达式是JDK8新增的一种语法格式 1.作用 2.用法规则&#xff1a; 3.方法引用 Lambda表达式是JDK8新增的一种语法格式 1.作用 简化匿名内部类的代码写法 Lambad用法前提&#xff1a;只能简化函数式接口&#xff08;一般加有Funcationallnterface&#xff09;&a…

2023年11月10日 Go生态洞察:十四年Go的成长之路

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

STL(八)(总结篇)

###以四道题来总结 题号:lanqiao OJ 3226 1.宝藏排序II ### 这道题主要考察sort,非常简单输出就是升序不需要自定义比较函数 #include<bits/stdc.h> using namespace std; const int N1e55; //这里用int就足够了不需要开long long int a[N]; int main(){ios::sync_with…

TCP的滑动窗口机制

网络的错误检测和补偿机制非常复杂。 一、等待超时时间&#xff08;返回ACK号的等待时间&#xff09; 当网络繁忙时会发生拥塞&#xff0c;ACK号的返回变慢&#xff0c;较短的等待时间会导致频繁的数据重传&#xff0c;导致本就拥塞的网络雪上加霜。如果等待时间过长&#xf…

查看mysql是否开启远程端口

这个命令&#xff1a; sudo netstat -tlnp | grep mysqld如果是 就说明只开启了本地的&#xff0c;要更改这个设置&#xff0c;你需要编辑 MySQL 的配置文件&#xff0c;并确保 bind-address 设置为 0.0.0.0。打开 MySQL 的配置文件&#xff08;通常是 /etc/mysql/mysql.conf…

二叉排序树的判断(二叉树的顺序存储):2022年408算法题

对于采用顺序存储方式保存的二叉树&#xff0c;根结点保存在SqBiTNode[0]中&#xff1b;当某结点保存SqBiTNode[i]中时&#xff0c;若有左孩子&#xff0c;则其值保存在SqBiTNode [2i1]中&#xff1b;若有右孩子&#xff0c;则其值保存在SqBiTNode[2i2]中&#xff1b;若有双亲结…

SD之lora训练

目录 为什么要训练自己的模型 SD模型微调方法 准备素材 1 确定要训练的LoRA类型 2 图片收集 3 图片预处理 4 图片标注 安装Koyha_ss 训练lora 1.准备参数和环境 2.启动训练 使用模型 1 拷贝训练过的lora模型 2 启动SD WebUI进行图像生成 为什么要训练自己的模型 …

来聊聊java8的数值流

简介 java8为我提供的简单快捷的数值流计算API&#xff0c;本文就基于几个常见的场景介绍一下数值流API的使用。 基础示例 我们以一个食物热量计算的功能展开演示&#xff0c;如下所示&#xff0c;可以看到Dish类它记录了每一个食物的名称、热量、类型等信息: public class…

百科词条可以删除吗?如何删除自己的百度百科?

近日&#xff0c;小马识途营销顾问接到不少客户删除自己百科词条的咨询&#xff0c;有不少人自己并没有去建立百科词条&#xff0c;但是网上已经有了&#xff0c;有的信息不正确&#xff0c;甚至有的信息是负能量的&#xff0c;对当事人自己造成一定的困扰&#xff0c;所以寻求…

【Proteus仿真】【51单片机】光照强度检测系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;PCF8591 ADC模块、光敏传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示光传感器采集光照强度值&#xff…

在线测试http接口,为您解析最佳测试方法

您是否正在寻找一种方便、高效且可靠的方法来测试您的http接口&#xff1f;在这篇文章中&#xff0c;我们将为您介绍在线测试http接口的最佳方法&#xff0c;帮助您确保您的接口在各种情况下都能正常运行。 什么是http接口&#xff1f; 在开始介绍如何测试http接口之前&#x…

json精讲

本文介绍json的规范及javascript和java对数据的交换读取 1. json介绍1.1 json简介1.2为什么使用 JSON&#xff1f; 2. json规范2.1基础规范2.2 key值为-字符串、数字、布尔值2.3 key值为对象Object2.4 key值为数组2.5 json本身就是一个数组 3.javascript操作json3.1 javascript…

git 本地有改动,远程也有改动,且文件是自动生成的配置文件

在改动过的地方 文件是.lock文件&#xff0c;自动生成的。想切到远程的分支&#xff0c;但是远程的分支也有改动过。这时候就要解决冲突&#xff0c;因为这是两个分支&#xff0c;代码都是不一样的&#xff0c;要先把这改动的代码提交在本地或者提交在本分支的远程才可以切到其…

freeswitch webrtc video_demo客户端进行MCU的视频会议

系统环境 一、编译服务器和加载模块 二、下载编译指定版本video_demo 三、配置verto.conf.xml 1.修改配置文件 2.重新启动 四、MCU通话测试 1.如何使用video_demo 2.测试结果 五、MCU的通话原理及音频/视频/布局/管理员等参数配置 附录 freeswitch微信交流群 系统环境 lsb_rel…

lv11 嵌入式开发 IIC(下) 20

目录 1 Exynos4412下IIC控制器介绍 1.1 总览 1.2 特征 1.3 工作框图 1.4 其他内容介绍 1.5 四种工作模式寄存器流程 2 IIC寄存器详解 2.1 概述 2.2 控制寄存器 2.3 状态寄存器 2.4 地址寄存器 2.5 数据寄存器 2.6 其他寄存器 3 MPU06050 3.1 简介 3.2 MPU6050主…

【已解决】解决UbuntuKali无法进行SSH远程连接

目录 Ubuntu20.04配置SSH远程连接Kali Linux配置SSH远程连接 Ubuntu20.04配置SSH远程连接 首先更新安装包 sudo apt-get update 下载SSH服务 sudo apt install openssh-server 查看SSH服务 service ssh status 打开 /etc/ssh/sshd_config文件修改配置文件 将PermitRootLog…