双指针算法(超详细版)

news2024/12/24 9:15:08
希望大家多多关注,有三必回

1.双指针

1.1快慢双指针

快慢双指针常用来解决循环问题,或是查找中间节点

1.1.1循环链表(141. 环形链表 - 力扣(LeetCode))

解题思路:

1.定义快慢指针fast和slow,让fast每次走两步,slow每次走一步

2.如果(slow==fast)相遇则证明有环,如果fast为空,则证明无环

为什么有环一定相遇?

因为我们假设两人赛跑,慢的人相对快的人就是静止的,如果有环,快慢人之间的距离就会不断减小,所以有环一定相遇 

//C++版
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode *slow = head, *fast = head; // 同时从起点出发
        while (fast && fast->next) {
            slow = slow->next; // 慢的走一步
            fast = fast->next->next; // 快的走两步
            if (fast == slow) // 相遇,说明有环
                return true;
        }
        return false; // 访问到了链表末尾,无环
    }
};
//C语言
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {
    ListNode*fast,*slow;
    fast=slow=head;
    while(fast&&fast->next)
    {
        fast=fast->next->next;
        slow=slow->next;
        if(fast==slow)
        return true;
    }
    return false;
}
 1.1.2中间节点(876. 链表的中间结点 - 力扣(LeetCode))

解题思路:

1.定义快慢指针fast和slow,让fast每次走两步,slow每次走一步

2.如果fast为空,则证明有此时的slow即为所求位置

//C++版
class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* slow = head;
        ListNode* fast = head;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }
};
//C语言版
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
    ListNode*fast,*slow;
    fast=slow=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

1.2对撞指针

1.2.1双变化趋势对撞指针(11. 盛最多水的容器 - 力扣(LeetCode))

解题思路:

设两指针 right , left ,分别指向⽔槽板的最左端以及最右端,此时容器的宽度为 right - left 。由于 容器的⾼度由两板中的短板决定,因此可得容积公式 : v = (right - left) * min( height[i], height[j])

注意点:

1.此时的容器宽度只会变小

2.当容器高度发生变化时,容积才会变化

3.不能改变数组的顺序

//C++版本
class Solution {
public:
    int maxArea(vector<int>& height) {
        int right = height.size() - 1, left = 0, ret = 0;
        while (right > left) 
        {
            int v1 = min(height[right], height[left]) * (right - left);
            ret = max(v1, ret);
            if (height[right] < height[left])
                right--;
            else
                left++;
        }
        return ret;
    }
};
//C语言版本
#define MIN(a, b) ((b) < (a) ? (b) : (a))
#define MAX(a, b) ((b) > (a) ? (b) : (a))

int maxArea(int* height, int heightSize) {
    int ans = 0, left = 0, right = heightSize - 1;
    while (left < right) {
        int area = (right - left) * MIN(height[left], height[right]);
        ans = MAX(ans, area);
        height[left] < height[right] ? left++ : right--;
    }
    return ans;
}
 1.2.2单变化趋势对撞指针(611. 有效三角形的个数 - 力扣(LeetCode))

如果能构成三⻆形,需要满⾜任意两边之和要⼤于第三边。但是实际上只需让较⼩的两条边 之和⼤于第三边即可。

解题步骤:

1.定义左右指针,即数组下标(lef=0,right=nums.size()-1),来固定三角形种

2.定义变量i来表示中间的边如果nums[i]+nums[left]>nums[right]则可以组成三角形

3.让left不断接近i

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());//让数组从小到大排列
        int n=nums.size()-1,ret=0;
        for(int right=n;right>=2;right--)//固定right最长边
        {
            int left=0,i=right-1;//固定第二长边i
            while(left<i)//让left不断变化
            {
                if(nums[i]+nums[left]>nums[right])//成立则说明可以组成三角形
                {
                    ret+=i-left;//即[left,i)都可以组成三角形
                    i--;
                }
                else//不成立让最短边边长
                {
                    left++;
                }
            }
        }
        return ret;
    }
};

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

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

相关文章

Rain后台权限管理系统,快速开发

这段时间一直没有更新&#xff0c;因为在写一个脚手架&#xff0c;今天Rain项目终于完工&#xff0c;已经发布到github,免费使用 项目github链接 https://github.com/Rain-hechang/Rain 简介 前端采用Vue3.x、Element UI。 后端采用Spring Boot、Spring Security、Redis &…

欧歌Web电视 1.2|全新修改版,新增更多频道,更稳定

欧歌Web电视App是一款功能强大的电视直播软件&#xff0c;通过WebView二次开发&#xff0c;对内置线路进行了优化和增加&#xff0c;让用户可以看到更多的频道。首次打开如果不会自动全屏&#xff0c;可以进入设置调整画面尺寸。该版本新增了多个地方频道和娱乐内容频道&#x…

嵌入式系统与移动设备开发

文章目录 1 嵌入式系统概述1.1 嵌入式系统基本概念1.1.1 嵌入式系统定义1.1.2 嵌入式系统的发展1.1.3 嵌入式系统的特点 1.2 嵌入式系统分类1.2.1 单个微处理器1.2.2 嵌入式处理器可扩展的系统1.2.3 复杂的嵌入式系统1.2.4 在制造或过程控制中使用的计算机系统 1.3 嵌入式处理器…

使用 Elastic 和 Amazon Bedrock 制作混合地理空间 RAG 应用程序

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Srinivas Pendyala, Ayan Ray 借助 Elasticsearch 及其向量数据库&#xff0c;你可以构建可配置的搜索和可信的生成式 AI (GenAI) 体验&#xff0c;这些体验可快速从原型扩展到生产。主要功能包括&#xff1a; 内…

【opencv入门教程】15. 访问像素的十四种方式

文章选自&#xff1a; 一、像素访问 一张图片由许多个点组成&#xff0c;每个点就是一个像素&#xff0c;每个像素包含不同的值&#xff0c;对图像像素操作是图像处理过程中常使用的 二、访问像素 void Samples::AccessPixels1(Mat &image, int div 64) {int nl imag…

Ansys Maxwell使用技巧

1、回到原点 点击Fit All 2、长方体做差 选中两个长方体&#xff0c; 点击Subtracct&#xff0c;就可以得到一个镂空的绕组。 3、电感仿真步骤 3.1 画磁芯 3.2 画绕组 3.3 加激励 选择截面积-右键绕组-Edit-Surface-Section-YZ 选择一个截面添加电流激励 3.4选材料 绕组一…

掌握谈判技巧,达成双赢协议

在当今竞争激烈且合作频繁的社会环境中&#xff0c;谈判成为了我们解决分歧、谋求共同发展的重要手段。无论是商业合作、职场交流&#xff0c;还是国际事务协商&#xff0c;掌握谈判技巧以达成双赢协议都具有极其关键的意义。它不仅能够让各方在利益分配上找到平衡点&#xff0…

MacOS 命令行详解使用教程

本章讲述MacOs命令行详解的使用教程&#xff0c;感谢大家观看。 本人博客:如烟花般绚烂却又稍纵即逝的主页 MacOs命令行前言&#xff1a; 在 macOS 上,Terminal&#xff08;终端) 是一个功能强大的工具&#xff0c;它允许用户通过命令行直接与系统交互。本教程将详细介绍 macOS…

第十七章 使用 MariaDB 数据库管理系统

1. 数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库。在当今这个大数据技术迅速崛起的年代&#xff0c;互联网上每天都会生成海量的数据信息&#xff0c;数据库技术也从最初只能存储简单的表格数据的单一集中存储模式&#xff0c;发展到了现如今存储海量…

11.17【大数据】Hadoop【DEBUG】

列出hdfs文件系统所有的目录和文件 主节点上 子结点 是一样的 *为什么能登进 slave 02 的主机,但是 master 当中依然显示 slave 02 为 DeadNode?* hadoop坏死节点的重启_hadoop3 子节点重启-CSDN博客 注意hadoop-daemon.sh 实际上位于 Hadoop 的 sbin 目录中&#xff0c;而不…

MetaGPT 安装

1. 创建环境 conda create -n metagpt python3.10 && conda activate metagpt2. 可编辑方式安装 git clone --depth 1 https://github.com/geekan/MetaGPT.git cd MetaGPT pip install -e .3. 配置 metagpt --init-config运行命令&#xff0c;在C盘位置C:\Users\325…

图的最小生成树(Kruskal算法,Prim算法)

无向图中的最短路径问题&#xff1f;No&#xff0c;最短路径不是最小生成树&#xff01; 什么是最小生成树&#xff1f; 在一个无向连通图中&#xff0c;有一个子图连接所有顶点&#xff0c;并且权重和最小&#xff0c;那么他就是最小生成树。如果权重和不是最小的只能叫做生…

【Flink-scala】DataStream编程模型之水位线

DataStream API编程模型 1.【Flink-Scala】DataStream编程模型之 数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之 窗口计算-触发器-驱逐器 文章目录 DataStream API编程模型前言…

PHP RabbitMQ连接超时问题

问题背景 Error: The connection timed out after 3 sec while awaiting incoming data 看到这个报错&#xff0c;我不以为意&#xff0c;认为是我设置的超时时间不够导致的&#xff0c;那就设置长一点 Error: The connection timed out after 300 sec while awaiting incom…

【LeetCode热题100】BFS解决FloodFill算法

这篇博客主要记录了使用BFS解决FloodFill算法的几道题目&#xff0c;包括图像渲染、岛屿数量、岛屿的最大面积、被包围的区域。 class Solution {using PII pair<int, int>; public:vector<vector<int>> floodFill(vector<vector<int>>& im…

L2G3000-LMDeploy 量化部署实践

文章目录 LMDeploy 量化部署实践闯关任务环境配置W4A16 量化 KV cacheKV cache 量化Function call LMDeploy 量化部署实践闯关任务 环境配置 conda create -n lmdeploy python3.10 -y conda activate lmdeploy conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.…

大数据新视界 -- 大数据大厂之 Hive 临时表与视图:灵活数据处理的技巧(上)(29 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Ubuntu操作系统在Vmware中的安装、常用操作、最基础的知识、imx6ll基本开发环境配置

01-Ubuntu操作系统的安装 网盘搜索 “ubuntu18.04.zip”&#xff0c;下载下来之后用Vmware打开就行了。 我用的虚拟机是15.5.6&#xff0c;实测没有问题。 启动时用户名为book的密码为123456 提问&#xff1a;Ubuntu与Centos系统有何区别&#xff1f; 详情见 https://blog.cs…

windows2012服务器安装sqlserver2012出现NetFx3错误的解决方法。

出现以下错误: 启用 Windows 功能 NetFx3 时出错&#xff0c;错误代码: -2146498298。请尝试从 Windows 管理工具启用 Windows 功能 NetFx3&#xff0c;然后重新运行安装程序。有关如何启用 Windows 功能的详细信息&#xff0c;具体解决办法如下&#xff1a; 1、打开PowerShel…

FPGA实战篇(按键控制LDE实验)

1.按键简介 按键开关是一种电子开关&#xff0c;属于电子元器件类。我们的开发板上有两种按键开关&#xff1a;第一种是本实验所使用的轻触式按键开关&#xff0c;简称轻触开关。使用时以向开关的操作方向施加压力使内部电路闭合接通&#xff0c;当撤销压力时开关断开&#xff…