双指针

  • 两数之和(有序数组,相向双指针)
  • 问题:在有序数组中找到两个数,使它们的和等于目标值。
  • 思路:左指针从起点出发,右指针从终点出发,根据和与目标值的大小调整指针。
#include <vector>
using namespace std;vector<int> twoSum(vector<int>& numbers, int target) {int left = 0;                  // 左指针(起点)int right = numbers.size() - 1; // 右指针(终点)while (left < right) {int sum = numbers[left] + numbers[right];if (sum == target) {// 找到目标,返回索引(题目可能要求+1,根据具体要求调整)return {left + 1, right + 1};} else if (sum < target) {// 和太小,左指针右移(增大总和)left++;} else {// 和太大,右指针左移(减小总和)right--;}}return {}; // 无结果(题目通常保证有解)
}

移动零

  • 思路:左指针从起点出发,右指针也从起点出发,但是快慢不同。

在这里插入图片描述

class Solution {        // 定义Solution类,用于封装解题方法
public:                 // 公共成员函数,外部可直接调用// 函数定义:接收整数数组nums的引用(原地修改),无返回值void moveZeroes(vector<int>& nums) {int l = 0;      // 定义慢指针l,初始化为0// 作用:记录下一个非零元素应该存放的位置int n = nums.size();  // 计算数组长度n,避免多次调用size()函数// 定义快指针r,从0开始遍历整个数组for(int r = 0; r < n; r++){// 当快指针指向的元素不是0时if(nums[r] != 0){// 将非零元素放到慢指针l的位置nums[l] = nums[r];// 慢指针后移一位,准备接收下一个非零元素l++;}}// 遍历结束后,慢指针l之前的位置已放满所有非零元素// 从l开始到数组末尾,填充0for(int i = l; i < n; i++){nums[i] = 0;}}
};

盛最多水的容器

在这里插入图片描述

class Solution {        // 定义Solution类,用于封装解题方法
public:                 // 公共成员函数,外部可直接调用// 函数定义:接收整数数组height的引用,返回最大容器容量(整数)int maxArea(vector<int>& height) {// 初始化双指针:left指向数组起点,right指向数组终点int left = 0, right = height.size() - 1;// 初始化最大容量为0,用于记录遍历过程中找到的最大容量int maxWater = 0;// 双指针循环条件:当左指针在右指针左侧时继续遍历while (left < right) {// 计算当前容器的高度:取左右指针所指高度的较小值(容器高度由矮边决定)int h = min(height[left], height[right]);// 计算当前容器的宽度:左右指针之间的距离(下标差)int w = right - left;// 更新最大容量:取当前容量(h*w)和历史最大容量的较大值maxWater = max(maxWater, h * w);// 指针移动策略:移动较矮一侧的指针(尝试寻找更高的边以增加容量)if (height[left] < height[right]) {left++;  // 左指针较矮,右移左指针} else {right--; // 右指针较矮(或等高),左移右指针}}// 循环结束后,返回最大容量return maxWater;}
};

三数之和

在这里插入图片描述

#include <vector>          // 引入vector容器头文件,用于存储动态数组
#include <algorithm>       // 引入algorithm头文件,用于调用sort排序函数
using namespace std;       // 使用std命名空间,简化代码书写class Solution {           // 定义Solution类,封装解题方法
public:                    // 公共成员函数,外部可直接调用// 函数定义:接收整数数组nums,返回所有和为0的三元组(不重复)vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;  // 定义结果容器,存储符合条件的三元组sort(nums.begin(), nums.end());  // 对数组排序:1.便于双指针查找 2.便于去重int n = nums.size();       // 计算数组长度n,避免重复调用size()// 外层循环:固定三元组中的第一个元素nums[i]for (int i = 0; i < n; ++i) {// 去重:若当前元素与前一个元素相同,跳过(避免重复三元组)if (i > 0 && nums[i] == nums[i - 1]) continue;// 定义双指针:left指向i的下一个元素,right指向数组末尾int left = i + 1, right = n - 1;// 双指针循环:寻找与nums[i]之和为0的两个元素while (left < right) {// 计算当前三元组的和int sum = nums[i] + nums[left] + nums[right];if (sum == 0) {  // 找到和为0的三元组// 将三元组加入结果容器res.push_back({nums[i], nums[left], nums[right]});// 去重:跳过left指针的重复元素while (left < right && nums[left] == nums[left + 1]) left++;// 去重:跳过right指针的重复元素while (left < right && nums[right] == nums[right - 1]) right--;// 双指针同时移动,继续寻找新的可能组合left++;right--;} else if (sum < 0) {  // 和小于0,需增大总和(左指针右移)left++;} else {  // 和大于0,需减小总和(右指针左移)right--;}}}return res;  // 返回所有符合条件的三元组}
};

接雨水

这个题目的关键是看每两个柱子之间的高度差,而不是相乘求面积!因为其中的数值有变化吗,如果按照求面积与盛水容器一样的方法就会导致多求!算错这是我的错误是思路!
但其相同点依旧是从左右指针开始判断大小。

 		int left = 0;int right = height.size() - 1;// 当左指针在右指针左侧时,继续遍历(两指针相遇则遍历结束)while (left < right) {......}

在这里插入图片描述

class Solution {
public:int trap(vector<int>& height) {// 左指针,初始指向数组最左端int left = 0;// 右指针,初始指向数组最右端int right = height.size() - 1;// 记录左侧已遍历区域的最高柱子高度int leftMax = 0;// 记录右侧已遍历区域的最高柱子高度int rightMax = 0;// 最终接雨水的总量int res = 0;// 当左指针在右指针左侧时,继续遍历(两指针相遇则遍历结束)while (left < right) {// 比较左右指针当前指向柱子的高度,优先处理较矮的一侧if (height[left] < height[right]) {// 左侧当前柱子高度 >= 左侧已记录的最高高度if (height[left] >= leftMax) {// 更新左侧最高高度为当前柱子高度leftMax = height[left];} else {// 当前柱子可接雨水 = 左侧最高高度 - 当前柱子高度res += leftMax - height[left];}// 左指针右移,处理下一个位置left++;} else {// 右侧当前柱子高度 >= 右侧已记录的最高高度if (height[right] >= rightMax) {// 更新右侧最高高度为当前柱子高度rightMax = height[right];} else {// 当前柱子可接雨水 = 右侧最高高度 - 当前柱子高度res += rightMax - height[right];}// 右指针左移,处理下一个位置right--;}}// 返回最终接雨水的总量return res;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI Infra与LLM的联系与差异

一、定义与定位LLM&#xff08;大语言模型&#xff09; 定义&#xff1a;基于海量文本训练的深度学习模型&#xff0c;通过Transformer架构实现语言理解与生成&#xff0c;典型代表如GPT-4、通义千问等。定位&#xff1a;AI应用的核心能力层&#xff0c;直接面向用户提供文本生…

数据结构-双链表

学习完单链表&#xff0c;现在继续学习双链表一、双链表结构带头双向循环链表&#xff08;简称&#xff1a;双链表&#xff09;注意&#xff1a;这⾥的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在单链表阶段称呼不严谨&#xff0c;但是为了同学们更好…

福彩双色球第2025090期篮球号码分析

明天是星期四&#xff0c;明天晚上双色球开奖。福彩双色球第2025090期篮球号码分析&#xff0c;上期开出号码05&#xff0c;数字形式是质数奇数2路球&#xff0c;小号0字头数字。本期篮球号码分析&#xff0c;篮球2尾数0212遗漏6期上次遗漏27期&#xff0c;篮球3尾数0313遗漏4期…

Python爬虫实战:研究Photon工具,构建企业信息收集系统

1. 引言 1.1 研究背景 在数字化时代,互联网作为全球最大的信息载体,涵盖商业情报、学术资源、公共信息等多个领域,对企业决策、学术研究和社会治理具有重要参考价值。传统信息获取方式依赖人工检索和简单脚本爬取,存在效率低下、覆盖范围有限、数据处理能力不足等问题。 …

Python Pandas.lreshape函数解析与实战教程

Python Pandas.lreshape 函数解析与实战教程 摘要 本教程旨在提供一份关于Pandas库中 pandas.lreshape 函数的全面使用教程和分析。lreshape 是一个用于数据重塑(Data Reshaping)的工具,具体而言,它擅长将“宽格式”(Wide Format)数据转换为“长格式”(Long Format)数…

vue3 el-dialog自定义实现拖拽、限制视口范围增加了拖拽位置持久化的功能

采用element-plus的拖拽功能代码,在此基础上增加了记忆拖拽上次拖拽位置的功能,开袋即食; 前提:每次关闭弹窗都要销毁; 解决了默认设置transform的偏移量后首次拖拽弹窗偏移量错误的问题修改。<template><el-dialogref="popupRefDialog":title="…

学习嵌入式之硬件——ARM体系

一、ARM内核基础知识1.ALU&#xff1a;算术逻辑单元&#xff1b;完成运算的电路2.通用寄存器&#xff1a;R0~R15R13&#xff08;SP&#xff09;&#xff1a;栈指针寄存器&#xff1a;指向栈顶的位置&#xff1b;并在函数调用、中断处理等场景中自动更新。R14&#xff08;LR&…

微信小程序中使用TensorFlowJS从环境搭建到模型训练及推理模型得到预测结果

1、小程序端环境准备app.json"plugins": {"tfjsPlugin": {"version": "0.2.0","provider": "wx6afed118d9e81df9"}}package.json"dependencies": {"tensorflow-models/posenet": "^2.2.…

深入剖析通用目标跟踪:一项综述

摘要 通用目标跟踪仍是计算机视觉领域一项重要且具有挑战性的任务,其难点在于复杂的时空动态变化,尤其在存在遮挡、相似干扰物和外观变化的情况下。过去二十年间,为应对这些挑战,研究者提出了多种跟踪范式,包括基于孪生网络的跟踪器、判别式跟踪器以及近期突出的基于Tran…

Next.js 链接与导航:页面间无缝切换

链接与导航&#xff1a;页面间无缝切换 关键要点 Next.js 提供了 <Link> 组件和程序化导航方法&#xff0c;实现页面间高效、无缝的切换。<Link> 组件利用客户端导航和预加载技术&#xff0c;优化用户体验和性能。程序化导航通过 useRouter 钩子&#xff08;Page…

根据经纬度(从nc格式环境数据文件中)提取环境因子

根据经纬度&#xff08;从nc格式环境数据文件中&#xff09;提取环境因子 文章目录前言一、准备所需文件二、代码分享总结前言 本文主要利用nc格式环境数据文件和物种经纬度分布文件&#xff0c;根据经纬度&#xff08;从nc格式环境数据文件中&#xff09;提取环境因子 一、准…

Uniapp 自定义 Tabbar 实现教程

Uniapp 自定义 Tabbar 实现教程1. 简介2. 实现步骤2.1 创建自定义 Tabbar 组件2.2 配置 pages.json3.1 路由映射3.2 样式设计3.3 图标处理4. 常见问题及解决方案4.1 页面跳转问题4.2 样式适配问题4.3 性能优化5. 扩展功能5.1 添加徽标5.2 添加动画效果6. 总结1. 简介 在 Uniap…

JuiceFS存储

因语雀与csdn markdown 格式有区别&#xff0c;请查看原文&#xff1a; https://www.yuque.com/dycloud/pss8ys 一、JuiceFS 介绍 1.1 JuiceFS 是什么 JuiceFS 是一款面向云环境设计的高性能 POSIX 文件系统&#xff0c;核心能力是将对象存储转化为全功能文件系统。它采用独…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十八) -> 构建HAR

目录 1 -> 前言 2 -> 使用约束 3 -> 创建模块 4 -> 构建HAR 4.1 -> 以debug模式构建HAR 4.2 -> 以release模式构建HAR 4.3 -> 构建字节码格式的HAR 4.4 -> 对HAR进行签名 1 -> 前言 构建模式&#xff1a;DevEco Studio默认提供debug和rele…

93、【OS】【Nuttx】【构建】cmake menuconfig 目标

【声明】本博客所有内容均为个人业余时间创作&#xff0c;所述技术案例均来自公开开源项目&#xff08;如Github&#xff0c;Apache基金会&#xff09;&#xff0c;不涉及任何企业机密或未公开技术&#xff0c;如有侵权请联系删除 背景 接之前 blog 【OS】【Nuttx】【构建】cm…

React 表单处理:移动端输入场景下的卡顿问题与防抖优化方案

文章目录每日一句正能量前言一、问题场景与表现二、技术攻坚过程三、优化效果与经验沉淀每日一句正能量 山再高&#xff0c;往上攀&#xff0c;总能登顶&#xff1b;路再长&#xff0c;走下去&#xff0c;终将到达。每日一励&#xff0c;勇往直前。 前言 在移动端 React 项目开…

数据安全防护所需要的关键要素

数据安全防护是一个覆盖数据全生命周期&#xff08;采集、存储、传输、处理、销毁&#xff09;、融合技术、管理、流程与人员的系统性工程。其核心目标是保障数据的​​保密性&#xff08;Confidentiality&#xff09;、完整性&#xff08;Integrity&#xff09;、可用性&#…

【JavaEE】(8) 网络原理 HTTP/HTTPS

一、什么是 HTTP 协议 上节说到&#xff0c;应用层的协议需要约定通信的内容和数据格式。我们可以自定义应用层协议&#xff0c;也可以基于现成的应用层协议进行开发。协议的种类很多&#xff0c;最常见的之一就是 HTTP&#xff0c;广泛用于网站和手机 App。准确来说&#xff0…

C语言的数组与字符串练习题4

C语言的数组与字符串练习题4 16. 数组元素去重 题目描述: 编写一个C程序,输入一组整数存储在数组中,去除数组中的重复元素,并输出去重后的数组。 解题思路: 遍历数组,对于每个元素,检查它之前是否已经存在相同的元素。如果不存在,则将其保留;否则,跳过。可以使用一…

Transformers简单介绍 - 来源于huggingface

Transformers介绍 - 来源于huggingface 文章目录Transformers介绍 - 来源于huggingfaceTransformers能做什么pipeline()函数零样本分类推理API完形填空命名实体识别问答摘要提取翻译transformers是如何工作的transformers的具体组成注意力层机制transformers原始结构architectu…