双指针刷题和总结

server/2025/3/4 17:11:04/

文章目录

  • 双指针
  • LeetCode
  • 反转字符串
    • 题目
    • 题解
    • 代码
  • 删除有序数组中的重复项 II
    • 题目
    • 题解
    • 代码
  • 除字符串中的所有相邻重复项
    • 题目
    • 题解
    • 代码
  • 删除有序数组中的重复项
    • 题目
    • 题解
    • 代码
  • 蓝桥杯
  • 拔河
    • 题解
    • 代码

双指针

1. 同向双指针:两个指针从同一侧开始,按照相同的方向移动。通常用于滑动窗口或需要维护某个区间的问题。
2. 反向双指针:两个指针分别从数据结构的左右两端开始,向中间移动。通常用于有序数组或需要从两端逼近的问题。
3. 快慢指针:两个指针以不同的速度移动,通常用于链表问题或检测循环。

LeetCode

反转字符串

题目

题目链接

题解

1. 很明显这题要用反向双指针,将字符串反过来,就是把字符串第一个字符和最后一个字符交换位置,以此类推就可以将字符串反过来了

代码

class Solution 
{
public:void reverseString(vector<char>& s) {int n = s.size();int l = 0,r = n - 1;while(l < r){swap(s[l],s[r]);l++;r--;}    }
};

删除有序数组中的重复项 II

题目

题目链接

题解

1. 快慢指针,快指针bp=2,慢指针sp = 1,快指针遍历数组一遍,找到sp-1元素和bp元素不等的情况,将++sp替换为bp

1    1    1    2    2    3  
sp-1 sp   bp // bp = sp-1
1    1    1    2    2    3
sp-1 sp        bp // bp != sp-1
1    1    2    2    2    3sp-1  sp        bp // bp != sp-1
1    1    1    2    2    3sp-1  sp        bp // bp != sp-1
1    1    1    2    2    3sp-1 sp       bp

代码

class Solution 
{
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if(n < 3) return n;int sp = 1,bp = 2;for(bp = 2;bp < n;bp++){if(nums[sp-1] != nums[bp]){nums[++sp] = nums[bp];}} return sp + 1;}
};

除字符串中的所有相邻重复项

题目

题目链接

题解

1. 这题用比较简单,如果栈为空,把元素插入到栈中,再和数组中的元素比较,如果相同就出栈,如果不同就入栈,最后剩余的元素就是答案
2. 但是要返回字符串,如果栈非空就把元素插入到字符串中,最后得到的字符串和答案是相反的,再逆置一下即可

代码

class Solution 
{
public:string removeDuplicates(string s) {// 栈stack<char> sk;for(auto ch : s){if(sk.empty()) sk.push(ch);else {if(sk.top() == ch) sk.pop();else sk.push(ch);}}string s1;while(!sk.empty()){s1.push_back(sk.top());sk.pop();}reverse(s1.begin(),s1.end());return s1;}
};

删除有序数组中的重复项

题目

题目链接

题解

1. 这题用栈也是可以的,先把第一个元素插入到空栈中,再和数组中的元素比较如果相同就不入栈,如果不同就入栈,就可以达到只保留一个数的目的
2. 可以用set去重,但是这题有个坑,不能直接返回n,要去重后把数组中的元素修改为去重后的,可能是它自己也要检测
3. 同向双指针,一个元素不需要去重直接返回,cur指针和i指针如果相同i就往后走,cur不动,如果不相同cur走到下一位置,i位置的指针赋给cur指针(就是直到找到不同的就给cur的下一个位置的指针,达到了不重复的效果)

代码

class Solution 
{
public:int removeDuplicates(vector<int>& nums) {// set去重,还要修改nums中元素的顺序// int m = nums.size();// set<int> st(nums.begin(),nums.end());// int n = st.size();// nums.clear();// for(auto& ch : st) nums.push_back(ch);// return n;int n = nums.size();if(n == 1) return 1;int cur = 0;for(int i = 0;i < n;i++){if(nums[cur] != nums[i]) {cur++;nums[cur] = nums[i];}}cur++;return cur;}
};

蓝桥杯

拔河

题目链接

题解

1. 这题其实可以用枚举算出每一种情况,如果两数的差最小,排序后一定相邻,最好是都开long long不然可能会爆空间

代码

#include <iostream>
#include<algorithm>
#include<vector>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;const int N = 1e3 + 10;
long long a[N];int main()
{int n;cin >> n;for(int i = 0;i < n;i++) cin >> a[i];vector<long long> ret;for(int i = 0;i < n;i++){long long s = 0;for(int j = i;j < n;j++){s += a[j];ret.push_back(s);}}long long ans = 1e9 + 10;sort(ret.begin(),ret.end());for(int i = 1;i < ret.size();i++){ans = min(ans,ret[i] - ret[i-1]);}cout << ans << '\n';return 0;
}

http://www.ppmy.cn/server/172382.html

相关文章

FPGA之硬件设计笔记-持续更新中

目录 1、说在前面2、FPGA硬件设计总计说明3、 原理图详解 - ARITX - 7 系列3.1 顶层框图介绍3.2 FPGA 电源sheet介绍&#xff1a;3.2.1 bank 14 和 bank 15的供电3.2.2 bank 0的供电3.2.3 Bank34 35 的供电 3.3 核电压和RAM电压以及辅助电压 4 原理图详解-- Ultrascale ARTIX4.…

决策树(Decision Tree):机器学习中的经典算法

1. 什么是决策树&#xff1f; 决策树&#xff08;Decision Tree&#xff09;是一种基于树形结构的机器学习算法&#xff0c;适用于分类和回归任务。其核心思想是通过一系列的规则判断&#xff0c;将数据集不断划分&#xff0c;最终形成一棵树状结构&#xff0c;从而实现预测目…

解释 CSS 盒模型的概念以及如何使用 box-sizing 属性

CSS 盒模型概念及 box-sizing 属性详解 一、什么是 CSS 盒模型&#xff1f; CSS 盒模型是网页设计和布局的基础概念之一。每个元素在网页中都可以被视为一个矩形的盒子&#xff0c;盒子包含了不同的区域&#xff0c;这些区域决定了元素在页面上的大小和位置。 1. 盒模型的组…

火语言RPA--PDF提取表格

【组件功能】&#xff1a;提取PDF文档指定位置表格 配置预览 配置说明 文件路径 支持T或# 默认FLOW输入项 待提取表格的PDF文件的完整路径。 提取位置 全部、指定页、指定范围3种位置供选择。 PDF文件密码 支持T或# 打开PDF文件的密码。 页码 支持T或# 提取指定页的页…

火山引擎 DeepSeek R1 API 使用小白教程

一、火山引擎 DeepSeek R1 API 申请 首先需要三个要素&#xff1a; 1&#xff09;API Key 2&#xff09;API 地址 3&#xff09;模型ID 1、首先打开火山引擎的 DeepSeek R1 模型页面 地址&#xff1a;账号登录-火山引擎 2、在页面右下角&#xff0c;找到【推理】按钮&#…

【C++】stack和queue以及priority_queue的使用以及模拟实现

目录 前言 一、栈和队列的使用 二、栈和队列的练习题 三、栈和队列的模拟实现 四、优先级队列介绍 五、优先级队列的模拟实现 总结 前言 本文主要介绍C【STL】中的栈(stack)和队列(queue)以及优先级队列(priority_queue)&#xff0c;在栈和队列模拟实现的中会了解到 deque(双端…

【C++】使用 CMake 在 Windows 上自动化发布 C++/Qt 应用程序

对于使用 MinGW 编译 C/Qt 项目的开发者来说&#xff0c;发布程序时常常面临目标机器缺少必要运行时库&#xff08;DLL&#xff09;的情况。传统方法需要手动收集依赖文件&#xff0c;不仅繁琐&#xff0c;还容易遗漏。本文将展示如何利用 CMake 构建系统&#xff0c;结合 Qt 官…

【弹框组件封装】展示、打印、下载XX表(Base64格式图片)

目录 打印、下载弹框组件组件使用弹框展示 打印、下载弹框组件 /components/PrintDialog.vue <!-- 打印、下载弹框 --> <template><el-dialog:title"title"top"3vh"append-to-body:visible.sync"dialogVisible":close-on-click…