算法练习之双指针算法

news2024/11/29 8:39:03

目录

前言

一、移动零【做题链接】

二、复写零【做题链接】

三、快乐数【做题链接】

四、盛水最多的容器【做题链接】

五、查找总价值为目标值的两件商品【做题链接】

六、三数之和【做题链接】

七、四数之和 【做题链接】

八、有效三角形的个数【做题链接】

总结


前言

欢迎感兴趣的小伙伴交流学习。


一、移动零【做题链接】

图1.1        题目描述
图1.2        题目解释

 题目代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) 
    {
        int green_pointer = 0;
        int blue_pointer = -1;

        for (; green_pointer < nums.size(); green_pointer++)
        {
            if (nums[green_pointer] != 0)
            {
                blue_pointer++;
                
                int tmp;
                tmp = nums[green_pointer];
                nums[green_pointer] = nums[blue_pointer];
                nums[blue_pointer] = tmp;
            }
        }
    }
};

二、复写零【做题链接】

图2.1        题目描述
图2.2        题目解析

题目代码:

class Solution {
public:
    void duplicateZeros(vector<int>& arr)
    {
        int write = arr.size() - 1;
        int count_write_zore = 0;
        int read;
        int i = 0;
        for (; count_write_zore < arr.size(); i++)
        {
            count_write_zore++;
            if (arr[i] == 0)
            {
                count_write_zore++;
            }
        }
        read = i - 1;
      
        for (; read >= 0; read--)
        {
            arr[write--] = arr[read];
            if (arr[read] == 0 && (read != i - 1 || count_write_zore == arr.size()))
            {
                arr[write--] = arr[read];
            }
        }
    }
};

三、快乐数【做题链接】

图3.1        题目描述

题目代码: 

class Solution {
public:
    int count(int n)
    {
        int ret=0;
        while(n%10!=0||n/10)
        {
            ret+=pow(n%10,2);
            n/=10;
        }
        cout<<ret<<" ";
        return ret;
    }

    bool isHappy(int n) 
    {
        int fast_pointer=count(count(n));
        int slow_pointer=n;

        while(fast_pointer!=slow_pointer)
        {   

            fast_pointer=count(count(fast_pointer));
            cout<<"(";
            slow_pointer=count(slow_pointer);
            cout<<")";
        }
       
        if(fast_pointer==1)
        {
            return true;
        }
        return false;
    }
};

四、盛水最多的容器【做题链接】

图4.1        题目描述
class Solution {
public:
    int maxArea(vector<int>& height) 
    {
        int left=0;
        int right=height.size()-1;
        int ret=0;

        while(left<right)
        {
           ret=max(ret,(right-left)*min(height[right],height[left]));
           if(height[left]<height[right])
           {
            left++;
           }
           else if(height[left]>=height[right])
           {
            right--;
           }
           cout<< ret<<" "<<left<<" ";
        }
        return ret;
    }
};

五、查找总价值为目标值的两件商品【做题链接】

图5.1        题目描述
class Solution 
{
public:
    vector<int> twoSum(vector<int>& price, int target) 
    {
        int left=0;
        int right=0;
        vector<int> ret;
        for(int i=0;i<price.size();i++)
        {
            left=i;
            right=price.size()-1;
            int need=target-price[i];
            while(left<right)
            {
                if(need>price[right])
                {
                    break;
                }
                else if(need<price[left])
                {
                    break;
                }
                else
                {
                    if(need==price[left]||need==price[right])
                    {
                        ret.push_back(price[i]);
                        if(need==price[left])
                        {
                            ret.push_back(price[left]);
                        }
                        else
                        {
                            ret.push_back(price[right]);
                        }
                        return ret;
                    }
                    left++;
                    right--;
                }
            }
        }
        return ret;
    }
};

 

六、三数之和【做题链接】

图6.1        题目描述
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums)
    {
        vector<vector<int>> ret;
        sort(nums.begin(), nums.end());    
        for (int i = 0; i < nums.size(); i++)
        {
            int left = i + 1;
            int right = nums.size() - 1;
            int target = -nums[i];
            if (i!=0&&nums[i] == nums[i - 1])
            {
                continue;
            }
            while (left < right)
            {
                
                if (target == nums[left]+ nums[right])
                {
                    if ((left!=i+1)&&nums[left]==nums[left-1]||(right!=nums.size()-1)&&nums[right]==nums[right+1])
                    {
                        if (nums[left] == nums[left - 1])
                        {
                            left++;
                        }
                        if (nums[right] == nums[right + 1])
                        {
                            right--;
                        }
                        continue;
                    }
                    ret.push_back({ nums[i],nums[left],nums[right]});
                    left++;
                    right--;
                }
                else if (target > nums[left] + nums[right])
                {
                    left++;
                }
                else if (target < nums[left]+ nums[right])
                {
                    right--;
                }
            }
        }
        return ret;
    }
};

七、四数之和 【做题链接】

图7.1        题目描述
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> ret;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++)
        {
            long long tmp1=target-nums[i];
            if(i!=0&&nums[i]==nums[i-1])
            {
                continue;
            }
            for(int j=i+1;j<nums.size();j++)
            {
                long long tmp2=tmp1-nums[j];
                if(j!=i+1&&nums[j]==nums[j-1])
                {
                    continue;
                }

                int left=j+1;
                int right=nums.size()-1;
                while(left<right)
                {
                    if(tmp2==nums[left]+nums[right])
                    {
                        if((left!=j+1&&nums[left]==nums[left-1])||(right!=nums.size()-1&&nums[right]==nums[right+1]))
                        {
                            if(nums[left]==nums[left-1])left++;
                            if(nums[right]==nums[right+1])right--;
                            continue;
                        }
                        ret.push_back({nums[i],nums[j],nums[left],nums[right]});
                        left++;
                        right--;
                    }
                    else if(tmp2>nums[left]+nums[right])
                    {
                        left++;
                    }
                    else if(tmp2<nums[left]+nums[right])
                    {
                        right--;
                    }
                }
            }
        }
        return ret;
    }
};

八、有效三角形的个数【做题链接】

图8.1        题目描述

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        if (nums.size() < 3) return 0;
        sort(nums.begin(), nums.end());
        int ret = 0;
        int n = nums.size();
        for (int i = n - 1; i >= 2; --i){//固定住最长的那条边
            int l = 0, r = i - 1;//l,r分别代表两条边
            while (l < r){
                if (nums[l] + nums[r] > nums[i]){
                    ret += r - l;
                    --r;
                }else{
                    ++l;
                }
            }
        }

        return ret;
    }
};

总结

本文介绍了一些有关双指针的算法,一些没有描述的在最近就会补上,另外,文中图片不清晰的可以去博主码云查看【点我】

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

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

相关文章

RuoYi-Vue-Plus (SpringCache、CacheManager、@Cacheable、缓存雪崩、击穿、穿透)

一、概述 1、SpringCache是Spring提供的一个缓存框架&#xff0c;在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中&#xff0c;在4.1开始&#xff0c;缓存已支持JSR-107注释和更多自定义的选项。 2、SpringCache利用了AOP&#xff0c;实现了基于注解的缓存功能&…

Python vs MATLAB:选择深度学习的首选编程语言

Python vs MATLAB&#xff1a;选择深度学习的首选编程语言 在深度学习领域&#xff0c;编程语言的选择对于初学者的学习路径和未来的职业发展至关重要。目前&#xff0c;Python和MATLAB都是进行科学计算和数据分析的流行工具&#xff0c;但它们在深度学习社区中的应用和受欢迎…

Vue报错:TypeError: Cannot read property ‘upgrade‘ of undefined

Vue报错&#xff1a;TypeError: Cannot read property ‘upgrade’ of undefined 前言 最近打开一个很就之前的开发项目&#xff0c;因为扫描包&#xff0c;所以删除了部分代码&#xff0c;后来就一直报错&#xff0c;现在总结一下。 报错原因&#xff1a;vue.config.js中 d…

vue3专栏项目 -- 四、前后端结合(上)

一、前后端分离是什么 前面我们一直在和静态数据打交道&#xff0c;虽然流程可以跑个半通&#xff0c;但是静态数据还是给我们造成了诸多不便&#xff0c;现在我们是时候用上后端了。 现在的应用开发模式&#xff0c;自从SPA出现以后&#xff0c;前端和后端可以平行的进行对应…

基于YOLOV8复杂场景下船舶目标检测系统

1. 背景 海洋作为地球上70%的表面积&#xff0c;承载着人类生活、经济发展和生态系统的重要功能。船舶作为海洋活动的主要载体之一&#xff0c;在海上运输、资源开发、环境监测等方面发挥着重要作用。复杂海洋环境下的船舶目标检测成为了海事管理、海洋资源开发和环境保护等领…

鸿蒙开发学习:初探【ArkUI-X】

ArkTS 是华为自研的开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配 ArkUI 框架&#xff0c;扩展了声明式 UI 、状态管理等相应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 ArkUI-X 进一步将 ArkUI 扩展到了多个 OS 平台…

公有云Linux模拟TCP三次挥手与四次握手(Wireshark抓包验证版)

目录 写在前面环境准备实验步骤1. 安装nc工具2. 使用nc打开一个连接2.1 公有云-安全组放行对应端口&#xff08;可选&#xff09; 3. 打开Wireshark抓包工具4. 新开终端&#xff0c;进行连接5. 查看抓包文件&#xff0c;验证TCP三次握手与四次挥手TCP三次握手数据传输TCP四次挥…

C++——二叉树搜索树

前面写了初阶数据结构——二叉树&#xff1b;本文内容是来对它来进行结尾 目录 一概念 二实现 2.1查找 2.2插入 2.3删除 完整源代码 三二叉树的应用 四二叉搜索树的性能分析 五二叉搜索树相关的面试题 一概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树…

牛津大学和上海交大将SAM和Flow应用于移动目标,简单而有效,轻松分割运动目标!

光流可以在运动物体分割中发现运动物体并为分割提供清晰的边界。然而&#xff0c;如果物体暂时静止&#xff0c;就会面临分割挑战。 而我们知道SAM可以很好的分割静态图像对象。因此&#xff0c;是否可以利用SAM与光流结合来在视频中进行移动物体分割&#xff1f; 今天给大家介…

开源web在线数据库设计软件 —— 筑梦之路

GitHub - drawdb-io/drawdb: Free, simple, and intuitive online database design tool and SQL generator. 简介 DrawDB是一款多功能且用户友好的在线工具&#xff0c;允许用户轻松设计数据库实体关系。通过简单直观的界面&#xff0c;DrawDB使用户能够创建图表、导出SQL脚本…

Spring6 的JdbcTemplate的JDBC模板类的详细使用说明

1. Spring6 的JdbcTemplate的JDBC模板类的详细使用说明 文章目录 1. Spring6 的JdbcTemplate的JDBC模板类的详细使用说明每博一文案2. 环境准备3. 数据准备4. 开始4.1 从数据表中插入(添加)数据4.2 从数据表中修改数据4.3 从数据表中删除数据4.4 从数据表中查询一个对象4.5 从数…

kafka安装及收发消息

kafka需要与zookeeper配合使用&#xff0c;但是从2.8版本kafka引入kraft&#xff0c;也就是说在2.8后&#xff0c;zookeeper和kraft都可以管理kafka集群&#xff0c;这里我们依然采用zookeeper来配合kafka。 1、首先我们下载zookeeper 下载地址为 https://zookeeper.apache.org…

openlayers实现绘制图标,并实现图标的聚合功能

点聚合说明 点聚合功能是指将地图上密集的点数据聚合成一个更大的点或者其他形状&#xff0c;以改善地图的可视化效果和性能。点聚合功能通常用于在地图上显示大量的点标记&#xff0c;例如地图上的POI&#xff08;兴趣点&#xff09;、传感器数据等。通过点聚合功能&#xff…

【机器学习300问】86、简述超参数优化的步骤?如何寻找最优的超参数组合?

本文想讲述清楚怎么样才能选出最优的超参数组合。关于什么是超参数&#xff1f;什么是超参数组合&#xff1f;本文不赘述&#xff0c;在之前我写的文章中有详细介绍哦&#xff01; 【机器学习300问】22、什么是超参数优化&#xff1f;常见超参数优化方法有哪些&#xff1f;htt…

[Bug]:由于中国防火墙,无法连接 huggingface.co

问题描述 : OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like youscan/ukr-roberta-base is not the path to a directory containing a file named config. Json. Checkout your internet …

支持视频切片的开源物联网平台

软件介绍 MzMedia开源视频联动物联网平台是一个简单易用的系统,该平台支持主流短视频平台&#xff08;如抖音、快手、视频号&#xff09;的推流直播功能&#xff0c;同时提供视频切片等功能。系统后端采用Spring Boot&#xff0c;前端采用Vue3和Element Plus&#xff0c;消息服…

[C++初阶]string的几道oj题

1.LCR 192. 把字符串转换成整数 (atoi) 这题难度不大,我这里采取遍历跳过空格的方式&#xff0c;我先展示出我的代码,然后慢慢讲解: class Solution { public:int myAtoi(string str) {if (str.empty()) return 0;int lengthstr.size();int i0;int symbol1;int sum0;while(i&l…

C++组合类

类的数据成员不但可以是基本类型&#xff0c;也可以是其它类的对象。 组合类就是指一个类包含其他类的对象作为该类的数据成员。 当组合类创建对象时&#xff0c;其中包含的各个数据成员对象应首先被创建。因此&#xff0c;在创建类的对象时&#xff0c;既要对本类的基本…

2024小红书电商实战营,养号打造IP/选爆品/开店铺/爆款笔记/等等(24节)

我们非常荣幸地为大家带来2024小红书电商实战营的第一期&#xff0c;在这里我们将带领大家一起深入学习如何利用小红书平台&#xff0c;实现个人品牌的发展和商业利益的增长。 首先&#xff0c;我们将讨论养号的重要性以及如何打造个人品牌。无论是建立自己的受众群体还是提高…

java基础知识点总结2024版(8万字超详细整理)

java基础知识点总结2024版&#xff08;超详细整理&#xff09; 这里写目录标题 java基础知识点总结2024版&#xff08;超详细整理&#xff09;java语言的特点1.简单性2.面向对象3.分布式4.健壮性5.安全性6.体系结构中立7.可移植性8.解释性9.多线程10.动态性 初识java中的main方…