codetop标签双指针题目大全解析(二),双指针刷穿地心!!!!!

复习比学习更重要,如果忘了就跟没学是一样的

  • 1.和为k的子数组
  • 2.统计[优美子数组]
  • 3.区间列表的交集
  • 4.将x减到0的最小操作
  • 5.替换子串得到平衡字符串
  • 6.划分字母区间
  • 7.分隔链表
  • 8.通过删除字母匹配到字典里最长单词
  • 9.寻找目标值-二维数组
  • 10.至多包含两个不同字符的最长子串
  • 11.最小差

1.和为k的子数组

给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组个数。子数组是数组中元素的连续非空序列

被骗啦,滑窗酷酷一顿做,结果nums可以有负数
也就是说left++的话窗口和也不一定变小,right++也不一定窗口和变大
滑动窗口失效的时候要用前缀和,前缀和我也写过秒杀系列->传送门

前缀和与子数组的关系是prefix[j] - prefix[i - 1] = k,假设现在遍历到k
先将前缀和prefix[j]存入哈希表,在求prefix[j] - k,看他在不在哈希表,如果在的话,说明存在一个prefix[i - 1]使prefix[j] - prefix[i - 1] = k

  1. 将当前累加和减去整数k的结果,在哈希表中查找是否存在
  2. 如果存在该key,证明以数组某一点为起点到当前位置满足题意,res+=val
  3. 判断当前累加和是否在哈希表中,若存在value+1,不存在则value=1
class Solution {
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int ,int> preSumCount = {{0, 1}};int preSum = 0, count = 0;for(int num : nums){preSum += num;count += preSumCount[preSum - k];preSumCount[preSum]++;}return count;}
};

2.统计[优美子数组]

在这里插入图片描述
看起来又很像滑动窗口,但其实最好别用,因为**滑动窗口一般用来解决的是窗口符合某个特定条件的问题,而不是窗口的数量,这种情况一般用哈希表和前缀和,**并且这题和30其实很像

我们可以通过记录前缀和出现的次数,来计算有多少个符合条件的子数组
prefix_count[i] = k 表示前缀和有i个奇数的数组有k个

二刷debug:忘记了

class Solution {
public:int numberOfSubarrays(vector<int>& nums, int k) {unordered_map<int, int> preSumNums = {{0, 1}};int count = 0, curSum = 0;for(int num : nums){curSum += (num % 2 == 1 ? 1 : 0);//奇数当1,偶数当0if(preSumNums.find(curSum - k) != preSumNums.end()) count += preSumNums[curSum - k];preSumNums[curSum]++;}return count;}
};

3.区间列表的交集

在这里插入图片描述
在这里插入图片描述
i为first的行,j为second的行

二刷debug:firstList[i][1] > secondList[j][1] ? j ++ : i ++;想了会,不是很熟

class Solution {
public:vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {int i = 0, j = 0, n = firstList.size(), m = secondList.size();vector<vector<int>> res;while(i < n && j < m){int l = max(firstList[i][0], secondList[j][0]);int r = min(firstList[i][1], secondList[j][1]);if(l <= r) res.push_back({l, r});firstList[i][1] > secondList[j][1] ? j ++ : i ++;}return res;}
};

4.将x减到0的最小操作

在这里插入图片描述
有些题目真的就是破烂(艹皿艹 )
这题考滑动窗口,但是考的很隐蔽,题目说只能移除nums最左边和最右边的元素,目标值是x,可以反着来,目标区间是中间的区域,目标值是sum - x
注意,元素一加立刻right++的话,窗口长度是right-left
for的话因为right会晚一步+1,所以窗口长度是right-left+1

class Solution {
public:int minOperations(vector<int>& nums, int x) {int sum = 0, temp = 0, res = -1;for(int num : nums) sum += num;int target = sum - x;if(target < 0) return -1;int left = 0, right = 0;while(right < nums.size()){temp += nums[right];right ++;while(temp > target) temp -= nums[left++];if(temp == target) res = max(res, right - left);}return res == -1 ? -1 : nums.size() - res;}
};

5.替换子串得到平衡字符串

在这里插入图片描述
二刷debug:忘记了不会

还是滑动窗口,不太一样的是,要观察的是窗口外的元素,可以叫他反向滑动(名字我瞎取的
设m = n/4。
滑动窗口内部是待替换字符串,窗口外是不替换的。
所以窗口外Q,W,E,R的个数都小于等于m,替换窗口内的字母才可能让字符串平衡。
所以right++意味着外面的元素少一个,这个是替换window需要记录的
如果窗口外有字符大于m,说明窗口内无论怎么替换都无法平衡。
用哈希表统计原串的字符个数
固定左边界,移动右边界。
如果剩余部分不替换的字符串中所有字母个数均≤m,则说明可以构造平衡字符串,则用滑窗长度更新最小替换子串长度
然后移动左边界,对子串长度进行缩小。

class Solution {
public:int balancedString(string s) {int n = s.size();int res = INT_MAX;unordered_map<char, int> a;for(char c : s) a[c] ++;int m = n / 4;if(a['Q'] == m && a['W'] == m && a['E'] == m && a['R'] == m) return 0;int l = 0, r = 0;while(r < n){char d = s[r];r ++;a[d] --;while(a['Q'] <= m && a['W'] <= m && a['E'] <= m && a['R'] <= m){res = min(res, r - l);char c = s[l];a[c] ++;l ++;}}return res;}
};

6.划分字母区间

在这里插入图片描述
返回的是每个小区间的长度
二刷debug:思路有点乱

class Solution {
public:vector<int> partitionLabels(string s) {unordered_map<char, int> map;int right = 0, left = 0;vector<int> res;for(int i = 0; i < s.size(); i ++) map[s[i]] = i;//记录最远坐标for(int i = 0; i < s.size(); i ++){right = max(right, map[s[i]]);if(i == right){res.push_back(right - left + 1);left = right + 1;}}return res;}
};

7.分隔链表

在这里插入图片描述
双指针总结里面原题
二刷debug:一次过

class Solution {
public:ListNode* partition(ListNode* head, int x) {ListNode* dummy1 = new  ListNode(0);ListNode* p1 = dummy1;ListNode* dummy2 = new ListNode(0);ListNode* p2 = dummy2;ListNode* cur = head;while(cur){if(cur->val < x){p1->next = cur;p1 = p1->next;}else{p2->next = cur;p2 = p2->next;}ListNode* temp = cur;cur = cur->next;temp->next = NULL;}p1->next = dummy2->next;delete dummy2;return dummy1->next;}
};

8.通过删除字母匹配到字典里最长单词

在这里插入图片描述
注意题目说的是返回长度最长且字母序最小的
字母序指的是字母的的ASCLL码值
长度最长是优先级1,字典序最小是优先级2

我A不出来在这里插入图片描述老老实实看题解学习

  • 首先排序dictionary,使他符合排序优先级1和优先级2
  • 遍历字符串数组dictionary中的字符串,用双指针i和j分别代表检查到s和dictionary[x]中的字符串
  • 当s[i] != dictionary[x],使i指针右移,如果相等的话,i和j都右移
  • 当j == p.size()的时候,说明dictionary中有一个字符串匹配完了,由于dictionary已经按照优先级排列了,所以直接输出

细节解释:两个优先级怎么解决?
用lambda函数来定义,该函数决定了两个字符串 a 和 b 的比较方式。

sort(dictionary.begin(), dictionary.end(), [](const string& a, const string& b) {return a.length() > b.length() || (a.length() == b.length() && a < b);});

a.length() > b.length():首先比较字符串 a 和 b 的长度。如果 a 的长度大于 b 的长度,则返回 true,意味着 a 应该排在 b 前面。这部分使得较长的字符串排在字典向量的前面。
(a.length() == b.length() && a < b)意思是:如果两个字符串长度相等,则比较它们的字典顺序。如果 a 在字典顺序上小于 b,则返回 true,意味着 a 应该排在 b 前面。这保证了长度相同的字符串按字典顺序排序。

二刷debug:边界情况考虑模糊,比如这里最后是 if (j == p.size()),容易写成p.size()-1
完整代码:

class Solution {
public:string findLongestWord(string s, vector<string>& dictionary) {sort(dictionary.begin(), dictionary.end(), [](const string& a, const string& b) {return a.length() > b.length() || (a.length() == b.length() && a < b);});for (const auto& p : dictionary) {int i = 0, j = 0;while (i < s.size() && j < p.size()) {if (s[i] == p[j]) j++;i++;}if (j == p.size()) return p;}return "";}
};

9.寻找目标值-二维数组

在这里插入图片描述

简单点说就是,这个园林树木的高度排列有迹可循,让你找一个高度target

思路:二维数组的右上角开始查找。如果当前元素等于目标值,则返回 true。如果当前元素大于目标值,则移到左边一列。如果当前元素小于目标值,则移到下边一行。
为什么从右上角找?要是从左上角,目标值只可能等于左上角或者大于左上角,大于的话你都不知道往哪里走,只有右上角才有唯一路走

如果plants.empty()为true,说明二维数组是空的,那么plants[0].size()就会因为非法访问报错

二刷debug:

  1. plants.size是行,plants[0].size()是列
  2. 判断plants和target关系的时候只能用if,用while的话i,j会超
  3. 判空,为空的话plants[0].size()就会因为非法访问报错
class Solution {
public:bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {if(plants.empty()) return false;int i = plants.size() - 1, j = 0;while(j >= 0 && j < plants[0].size() && i >= 0 && i < plants.size()){if(plants[i][j] < target) j ++;else if(plants[i][j] > target) i --;else return true;}return false;}
};

10.至多包含两个不同字符的最长子串

会员题
在这里插入图片描述
显然用滑动窗口

class Solution {
public:int lengthOfLongestSubstringTwoDistinct(string s) {int valid = 0;unordered_map<char, int> window;int ans = 1;int left = 0;int right = 0;while (right < s.length()) {char c = s[right];if (window[c] == 0) {valid++;}window[c]++;// 窗口缩小,左指针右移while (valid > 2) {char deleteChar = s[left];left++;window[deleteChar]--;if (window[deleteChar] == 0) {valid--;}}ans = max(ans, right - left + 1);right++;}return ans;}
};

11.最小差

给定两个整数数组a和b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差
有用例[-2147483648,1],[2147483647,0]
必须用long,因为:

-2147483648 是 int 类型的最小值。 2147483647 是 int 类型的最大值。

如果选择 a 中的 -2147483648 和 b 中的 2147483647 进行计算,差值为:

2147483647 - (-2147483648) = 2147483647 + 2147483648 = 4294967295

这个结果 4294967295 超出了 int 类型的表示范围(int 的范围是 -2147483648 到 2147483647)。所以必须用long

class Solution {
public:int smallestDifference(vector<int>& a, vector<int>& b) {sort(a.begin(), a.end());sort(b.begin(), b.end());long dist = INT_MAX;int i = 0, j = 0;while(i < a.size() && j < b.size()){long temp = a[i] - b[j];dist = min(dist, abs(temp));if(temp < 0) i ++;else j ++;}return dist;}
};

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

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

相关文章

麒麟系统串口配置篇

麒麟系统串口配置篇 1.配置串口驱动&#xff08;编译/动态加载串口&#xff09; 解压文件夹,然后在解压后的文件夹所在目录&#xff0c;右键选择打开终端&#xff0c;依次执行以下命令&#xff1a; 以麒麟系统下的CH341串口驱动为例&#xff0c;解压CH341SER_LINUX.zip sudo…

2024_10_8 系统进展

改进位置 发现是label_api里藏了我需要改进的东西 settings.py 数据库 我这边电脑上使用的是windows 192 vue.config.js 陈家强是这样设置的 module.exports {publicPath: process.env.NODE_ENV production? /: /,assetsDir: static,// css: {// extract: false// },…

【C++ 11】for 基于范围的循环

文章目录 【 1. 基本用法 】【 2. for 新格式的应用 】2.1 for 遍历字符串2.2 for 遍历列表2.3 for 遍历的同时修改元素 问题背景 C 11标准之前&#xff08;C 98/03 标准&#xff09;&#xff0c;如果要用 for 循环语句遍历一个数组或者容器&#xff0c;只能套用如下结构&#…

“我养你啊“英语怎么说?别说成I raise you!成人学英语到蓝天广场附近

“我养你啊”这句经典台词出自周星驰自导自演的电影《喜剧之王》。在这部电影中&#xff0c;周星驰饰演的尹天仇对张柏芝饰演的柳飘飘说出了这句深情而动人的台词。这句台词出现在柳飘飘即将离去之时&#xff0c;尹天仇鼓起勇气&#xff0c;用它作为对柳飘飘个人困境的承诺&…

VIP与MPIO,备胎管理谁更强

我爱上班&#xff0c;风雨无阻 大家每天去上班&#xff0c;不可能只有一条路线 可以地铁、也可以开车或公交 万一地铁停运或车子限行&#xff0c;至少还有其他线路选择 企业级存储也是如此 关键业务的存储访问一般有多条路径 网络或单个存储设备故障后 访问路径会自动切换…

集合框架05:List接口使用、List实现类、ArrayList使用

视频链接&#xff1a;13.11 ArrayList使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?p11&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.List接口使用代码举例 package com.yundait.Demo01;import java.util.ArrayList; import java.util.List;pu…

轻松掌握IP代理服务器设置方法,网络冲浪更自如

在数字化时代&#xff0c;互联网就像是一片浩瀚的海洋&#xff0c;而IP代理服务器就如同我们在这片海洋中航行的指南针。通过使用代理IP&#xff0c;我们可以更方便地访问全球网络资源&#xff0c;提升网络安全性。本文将为您详细介绍IP代理服务器的设置方法&#xff0c;让您在…

指针——指针数组、数组指针

&#xff08;一&#xff09;指针数组 1、本质&#xff1a;指针数组的本质任然是数组 2、基本格式&#xff1a;int* arr[5] 3、应用&#xff1a;如尝试使用指针来模拟二维数组 先来看代码 #include<stdio.h> //指针数组——模拟实现二维数组 int main() {int a[5] {…

本科毕业论文不会写怎么办,论文查重显示80%多

如果本科毕业论文不会写且查重显示 80% 多&#xff0c;可以从以下几个方面着手解决&#xff1a; 一、调整心态&#xff0c;正视问题 首先&#xff0c;不要惊慌和焦虑。高重复率并不意味着无法挽救&#xff0c;要相信自己有能力解决这个问题。把它看作是一个学习和提升的机会&a…

Matlab实现海鸥优化算法优化回声状态网络模型 (SOA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 海鸥优化算法&#xff08;Seagull Optimization Algorithm, SOA&#xff09;是一种受海鸥觅食和飞行行为启发的群体智能优化算法。SOA通过模拟海鸥在空中搜寻食物、聚集和分散的行为模式&#xff0c;来探索和开发…

Leecode刷题之路第13天之罗马数字转整数

题目出处 13-罗马数字转整数-题目出处 题目描述 个人解法 思路&#xff1a; todo 代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo 官方解法 13-罗马数字转整数-官方解法 方法1&#xff1a;模拟 思路&#xff1a; 代码示例&#xff1a;&#xff0…

ctf.bugku - game1

题目来源&#xff1a; game1 - Bugku CTF 访问页面&#xff0c;让玩游戏 得到100分&#xff0c;没拿到flag 查看页面源码&#xff0c; GET请求带有 score、IP、sign 三个参数&#xff0c;最后的flag 应该跟分数有关&#xff1b; 给了score一个99999分数&#xff0c; sign 为 …

dotnet7==windows ZIP方式安装和web demo和打包

下载ZIP Download .NET 7.0 (Linux, macOS, and Windows) 解压 创建项目 mkdir MyWebApp cd MyWebApp "C:\Users\90816\Downloads\dotnet-sdk-7.0.317-win-x64\dotnet.exe" new webapp -n MyWebApp 运行项目 "C:\Users\90816\Downloads\dotnet-sdk-7.0.317-…

同城O2O系统源码与跑腿配送平台的架构设计与开发方案详解

今天&#xff0c;笔者将与您一同深入探讨同城O2O系统的源码及跑腿配送平台的架构设计与开发方案&#xff0c;助力开发者和企业在这一领域的实践与探索。 一、O2O系统概述 在同城O2O模式中&#xff0c;用户可以通过手机应用或网页平台下单&#xff0c;而配送员则根据订单信息迅…

QT 优化登录框

作业 优化登录框&#xff1a; 当用户点击取消按钮&#xff0c;弹出问题对话框&#xff0c;询问是否要确定退出登录&#xff0c;并提供两个按钮&#xff0c;yes|No&#xff0c;如果用户点击的Yes&#xff0c;则关闭对话框&#xff0c;如果用户点击的No&#xff0c;则继续登录 …

信息安全——应急响应

应急响应部分 1、提交攻击者的IP地址 简单过一遍apache日志&#xff0c;less /var/log/apache2/access.log.1 很明显的可以发现大量的扫描流量&#xff0c;如下&#xff1a; 大量的并发连接&#xff0c;且访问资源均返回404&#xff0c;且UA不正常&#xff0c;从这里可以得…

【重学 MySQL】六十二、非空约束的使用

【重学 MySQL】六十二、非空约束的使用 定义目的关键字特点作用创建非空约束删除非空约束注意事项 在MySQL中&#xff0c;非空约束&#xff08;NOT NULL Constraint&#xff09;是一种用于确保表中某列不允许为空值的数据库约束。 定义 非空约束&#xff08;NOT NULL Constra…

Prometheus + Grafana 监控 MySQL 数据库

文章目录 1、前置介绍2、搭建流程2.1、安装 Docker2.2、安装 MySQL2.3、安装 MySQL Exporter2.4、安装 Prometheus2.5、安装 Grafana 1、前置介绍 本次监控平台搭建&#xff0c;我使用2台阿里云服务器来完成本次的搭建部署操作&#xff0c;配置如下&#xff1a; 阿里云ECS1&am…

《CTF 特训营》:网络安全竞赛的进阶指南

在网络安全领域日益受到重视的今天&#xff0c;CTF&#xff08;Capture The Flag&#xff09;竞赛作为一种检验和提升网络安全技能的方式&#xff0c;受到了越来越多爱好者的关注。而《CTF 特训营》这本书&#xff0c;无疑是一本帮助读者深入了解 CTF 竞赛的优秀读物。 一、书籍…

基于LORA的一主多从监测系统_AHT20温湿度传感器

1&#xff09;AHT20温湿度传感器 这个传感器&#xff0c;网上能找到的资料还是比较多的&#xff0c;我们使用的是HAL硬件i2c&#xff0c;相比于模拟i2c&#xff0c;我们不需要过于关注时序问题&#xff0c;我们只需要关心如何获取数据以及数据如何处理&#xff0c;下面以数据手…