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

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


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;
    }
};


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

祝你好运,向阳而生~


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

保姆级秋招教程之简历篇

大家好&#xff0c;我是千寻哥&#xff0c;个人简历在程序员求职过程中扮演着至关重要的角色。 今天我将详细给大家介绍一下写简历的必备要素和布局&#xff0c;同时强调应避免的“坑”&#xff01; 希望能通过这些技巧&#xff0c;能帮助程序员打造一份出色的简历&#xff0c;…

WEB:mfw

背景知识 Git泄露 Githack使用 命令执行漏洞 题目 这里页面里有Git&#xff0c;猜测是Git泄露 先用dirsearch扫一下 确实存在.git目录&#xff0c;可以尝试访问一下 使用Githack来下载并恢复.git文件 这里记得使用的时候关闭杀毒软件 结果会自动保存 点进去先看一下flag这个…

【前端知识】React 基础巩固(四十二)——React Hooks的介绍

React 基础巩固(四十二)——React Hooks的介绍 一、为什么需要Hook? Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下使用state以及其他的React特性&#xff08;比如生命周期&#xff09;。 class组件 VS 函数式组件&#xff1a; class的优势…

【机器学习】Feature scaling and Learning Rate (Multi-variable)

Feature scaling and Learning Rate 1、数据集2、学习率2.1 α \alpha α 9.9e-72.2 α \alpha α 9e-72.3 α \alpha α 1e-7 3、特征缩放3.1 特征缩放的原因3.2 Z-score 归一化3.3 预测3.4 损失等值线 导入所需的库 import numpy as np np.set_printoptions(precision…

为Win12做准备?微软Win11 23H2将集成AI助手:GPT4免费用

微软日前确认今年4季度推出Win11 23H2&#xff0c;这是Win11第二个年度更新。 Win11 23H2具体有哪些功能升级&#xff0c;现在还不好说&#xff0c;但它会集成微软的Copilot&#xff0c;它很容易让人想到多年前的“曲别针”助手&#xff0c;但这次是AI技术加持的&#xff0c;Co…

在k8s集群内搭建Prometheus监控平台

基本架构 Prometheus由SoundCloud发布&#xff0c;是一套由go语言开发的开源的监控&报警&时间序列数据库的组合。 Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的…

Linux上定位线上CPU飙高

【模拟场景】 写一个java main函数&#xff0c;死循环打印 System.out.println(“111111”) &#xff0c; 将其打成jar包放在linux中执行 1、通过TOP命令找到CPU耗用最厉害的那个进程的PID 2、top -H -p 进程PID 找到进程下的所有线程 可以看到 pid 为 94384的线程耗用cpu …

UM2080F32——32位SoC芯片

UM2080F32是基于ARM Cortex-M0内核的超低功耗、高性能的、单片集成(G)FSK/OOK无线收发机的32位SoC芯片。工作于200MHz~960MHz范围内&#xff0c;支持灵活可设的数据包格式&#xff0c;支持自动应答和自动重发功能&#xff0c;支持跳频操作&#xff0c;支持FEC功能&#xff0c;同…

BugKu CTF(杂项篇MISC)—社工-进阶收集

BugKu CTF(杂项篇MISC)—社工-进阶收集 提 示: flag{小美小区名字拼音} 描 述: 小明当年为了追求小美想尽办法获得小美的地址。直到有一天小美发了一条说说&#xff0c;小明觉得希望来了。(实战改编题&#xff0c;难度降低了。) [外链图片转存失败,源站可能有防盗链机制,建议…

yolov3-tiny原理解析及代码分析

前言 从去年十一月份开始学习yolo神经网络用于目标识别的硬件实现&#xff0c;到现在已经六个月了。一个硬件工程师&#xff0c;C/C基础都差劲的很&#xff0c;对照着darknet作者的源码和网上东拼西凑的原理讲解&#xff0c;一点一点地摸索。刚开始进度很慢&#xff0c;每天都…

pytorch学习——模型选择

一.概念 模型选择是机器学习中的重要环节&#xff0c;它涉及到从各种统计&#xff0c;机器学习或深度学习模型中选取最佳模型的过程。这涉及到许多关键概念&#xff0c;包括偏差与方差&#xff0c;过拟合与欠拟合&#xff0c;训练误差和泛化误差&#xff0c;交叉验证&#xff0…

【计算机网络】传输层协议 -- TCP协议

文章目录 1. TCP协议的引入2. TCP协议的特点3. TCP协议格式3.1 序号与确认序号3.2 发送缓冲区与接收缓冲区3.3 窗口大小3.4 六个标志位 4. 确认应答机制5. 超时重传机制6. 连接管理机制6.1 三次握手6.2 四次挥手 7. 流量控制8. 滑动窗口9. 拥塞控制10. 延迟应答11. 捎带应答12.…

Inkscape 1.3 版开放源代码 SVG 编辑器发布,新增形状生成器工具和许多更改

导读Inkscape 是功能强大的开源、跨平台、免费 SVG&#xff08;可缩放矢量图形&#xff09;编辑器&#xff0c;今天已更新到稳定的 1.3 版&#xff0c;这是一个引入新功能和许多改进的重要版本。 Inkscape 1.3 是在 Inkscape 1.2 发布一年零两个月后推出的&#xff0c;它引入了…

python-网络爬虫.regular

regular 正则表达式 (regular expression) 正则表达式(regular expression)描述了一种字符串匹配的模式 &#xff08;pattern&#xff09;&#xff0c; 可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串 中取出符合某个条件的子串等。 正则表达式是由普通…

学C的第三十一天【通讯录的实现】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十天【自定义类型&#xff1a;结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求&#xff1a; 实现一个通讯录&#xff0c; 通讯录中存放保存人的信息&#xff1…

SpringBoot中MongoDB的使用

SpringBoot中MongoDB的使用 MongoDB 是最早热门非关系数据库的之一&#xff0c;使用也比较普遍&#xff0c;一般会用做离线数据分析来使用&#xff0c;放到内网的居 多。由于很多公司使用了云服务&#xff0c;服务器默认都开放了外网地址&#xff0c;导致前一阵子大批 MongoD…

P1535 [USACO08MAR] Cow Travelling S(dfs+剪枝 or 记忆化搜索)

1:本题暴力做法简单&#xff0c;重点在于我们如何剪枝&#xff1a; :《曼哈顿距离》我们每走一个点就判断&#xff0c;当前点到终点的最短步数是不是小于当前剩余的步数&#xff0c; 如果大于就肯定不符合直接return,或者当步数为0时&#xff0c;当还没到达终点&#xff0c;那…

springSecurity自定义过滤器不生效问题排查

在使用springSecurity过滤器的过程中&#xff0c;由于需要自定义一个过滤器处理数据问题。代码如下&#xff1a; 过滤器定义&#xff1a; public class AuthRequestParamFiler extends GenericFilterBean {private static final CoreLogger LOGGER CoreLoggerFactory.getLog…

Flink - souce算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 1. 从Java的集合中读取数据 2. 从本地文件中读取数据 3. 从HDFS中读取数据 4. 从Socket中读取数据 5. 从Kafka中读取数据 6. 自定义Source 官方文档 - Flink1.13 1. 从Java的集合中读取数据 …

【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息

文章目录 前言导入依赖库设置ChromeDriver的路径创建Chrome WebDriver对象打开网页找到结果元素创建一个空列表用于存储数据遍历结果元素并提取数据提取标题、作者、发布时间等信息判断是否为目标文章提取目标文章的描述、阅读数量、点赞数量、评论数量等信息将提取的数据存储为…