面试经典算法题之双指针专题

news/2024/5/19 16:06:22

力扣经典面试题之双指针 ( 每天更新, 每天一题 )

文章目录

  • 力扣经典面试题之双指针 ( 每天更新, 每天一题 )
    • 验证回文串
      • 收获
    • 392. 判断子序列
    • 167. 两数之和 - 输入有序数组
    • 11.盛开多水的容器
    • 三数之和

验证回文串

在这里插入图片描述
思路

一: 筛选 + 双指针验证

class Solution {
public:bool isPalindrome(string s) {// 所有大写字母 ==> 小写 去除非字母部分if(s == "") {return true;}string str = "";int s_size = s.size();for(int i = 0; i< s_size; i++) {// 大写字母if(s[i]-'0' >= 'A'-'0' && s[i]-'0' <= 'Z'-'0' ) {str += 'a'+s[i]-'A';}else if ((s[i]-'0' >= 'a'-'0' && s[i]-'0' <= 'z'-'0') || isdigit(s[i])) {str += s[i];}}// 判断回文int str_size = str.size();for(int l = 0, r = str_size-1;l < r ;l++, r-- ) {// 不相等if(str[l] != str[r]) {return false;}}return true;}
};

代码二: 巧用 API
最简单的方法是对字符串 sss 进行一次遍历,并将其中的字母和数字字符进行保留,放在另一个字符串
第一种是使用语言中的字符串翻转 API 得到 sgood 的逆序字符串

class Solution {
public:bool isPalindrome(string s) {string sgood;for (char ch: s) {if (isalnum(ch)) {sgood += tolower(ch);}}string sgood_rev(sgood.rbegin(), sgood.rend());return sgood == sgood_rev;}
};

收获

这到题目, 就是简单的双指针例题
在代码中使用到一些函数,可以记一下
tolower(ch) 函数 是把大写字母转成小写字母
isdigit(ch) 函数 是判断该字符是否为数字,也就是 ‘0’ 到 ‘9’

392. 判断子序列

在这里插入图片描述
思路
一、 双指针
就是两个字符串都有一个指针
分别移动
二、动态规划
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;bool isSubsequence(string s, string t)
{// 直接暴力int s_size = s.size();int t_size = t.size();int i = 0;int j = 0;for (; i < s_size && j < t_size;){if (s[i] == t[j]){i++;}j++;}if (i == s_size){return true;}else{return false;}
}
int main()
{string s, t;s = "dfadf";t = "dfadf";cout<<isSubsequence(s,t)<<endl;return 0;
}

动态规划

class Solution {
public:bool isSubsequence(string s, string t) {int n = s.size(), m = t.size();vector<vector<int> > f(m + 1, vector<int>(26, 0));for (int i = 0; i < 26; i++) {f[m][i] = m;}for (int i = m - 1; i >= 0; i--) {for (int j = 0; j < 26; j++) {if (t[i] == j + 'a')f[i][j] = i;elsef[i][j] = f[i + 1][j];}}int add = 0;for (int i = 0; i < n; i++) {if (f[add][s[i] - 'a'] == m) {return false;}add = f[add][s[i] - 'a'] + 1;}return true;}
};

167. 两数之和 - 输入有序数组

在这里插入图片描述
思路
一 、 遍历 + 二分查找 ( 有序 )
二、 直接数组左右两边双指针, 求和遍历
Code

class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {for (int i = 0; i < numbers.size(); ++i) {int low = i + 1, high = numbers.size() - 1;while (low <= high) {int mid = (high - low) / 2 + low;if (numbers[mid] == target - numbers[i]) {return {i + 1, mid + 1};} else if (numbers[mid] > target - numbers[i]) {high = mid - 1;} else {low = mid + 1;}}}return {-1, -1};}
};

写法二: 这里有空可以研究一下

简单来说就是, 有关于万能模板, 如果遇到这种左边界 或者 右边界 变化时, 需要做出什么样的改变

class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {for(int i = 0;i< numbers.size() ; i++ ) {int l = i;// 左边下标int r = numbers.size()-1;    // 这里 需要减1  不减 1 就会出现数组越界    int mid = 0;while( l + 1 != r) {mid = (l+r) / 2;if(numbers[mid] < target - numbers[i]) {l = mid;} else {r = mid;}}// 判断一下if(numbers[r] == target -numbers[i]) {return {i+1,r+1};}}return {-1,-1};}
};
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int l = 0;int r = numbers.size()-1;while(l < r) {int sum = numbers[l] + numbers[r];if(sum> target) {r--;} else if(sum < target ) {l++;} else {return {l+1, r+1};}}return {-1,-1};}
};

11.盛开多水的容器

在这里插入图片描述
思路
在这里插入图片描述

class Solution {
public:int maxArea(vector<int>& height) {// 这里有个关键的点就是// 移动长板一定会变小// 移动短板就可以能变大int max = 0;int l = 0;int r = height.size()-1;while(l < r) {// 计算面积int sum = min(height[r],height[l])*(r-l);if(sum > max) {max = sum;}// 左边小if(height[r] > height[l]) {l++;} else {r--;}}return max;}
};

三数之和

在这里插入图片描述

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int num_size = nums.size();vector<vector<int>> result;// 返回 所有组合    // 排序 + 哈希sort(nums.begin(), nums.end());for(int i = 0; i< num_size; i++) {if(nums[i] > 0 ) {  // 第一个元素大于 0break;}// 去重if(i > 0 && nums[i-1] == nums[i] ) {continue;    // 继续}// 哈希查找unordered_set<int> set;for(int j = i+1; j< num_size; j++) {// 去重 元素 bif(j > i+ 2 && nums[j] == nums[j-1] && nums[j-1] == nums[j-2]) {continue;}int c = 0-(nums[i] + nums[j]);if(set.find(c) != set.end()) {result.push_back({nums[i],nums[j],c});set.erase(c);} else {set.insert(nums[j]);}}}        return result;}
};

双指针 + 排序

#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> threeSum(vector<int> &nums)
{sort(nums.begin(), nums.end());vector<vector<int>> result;for (int i = 0; i < nums.size(); i++){int l = i + 1;int r = nums.size() - 1;if (nums[i] > 0){break;}// 去重if (i > 0 && nums[i] == nums[i - 1]){continue;}while (l < r){int sum = nums[i] + nums[l] + nums[r];if (sum > 0){r--;}else if (sum < 0){l++;}else{result.push_back({nums[i], nums[l], nums[r]});while (l < r && nums[r] == nums[r - 1])r--;while (l < r && nums[l] == nums[l + 1])l++;// 继续找符合要求组合r--;l++;}}}return result;
}int main()
{vector<int> vec = {-1,0,1,2,-1,-4};vector<vector<int>> res = threeSum(vec);for(int i=0; i<res.size(); i++) {for(int j=0; j<res[i].size(); j++) {cout<<res[i][j]<<" ";}cout<<endl;}return 0;
}

http://www.mrgr.cn/p/00337540

相关文章

Linux的基础IO:文件描述符 重定向本质

目录 前言 文件操作的系统调用接口 open函数 close函数 write函数 read函数 注意事项 文件描述符-fd 小补充 重定向 文件描述符的分配原则 系统调用接口-dup2 缓冲区 缓冲区的刷新策略 对于“2”的理解 小补充 前言 在Linux中一切皆文件&#xff0c;打开文件…

LabVIEW机械臂控制与图像处理示教平台

LabVIEW机械臂控制与图像处理示教平台 随着工业自动化技术的快速发展&#xff0c;工业机器人在制造业中的应用越来越广泛&#xff0c;它们在提高生产效率、降低人工成本以及保证产品质量方面发挥着重要作用。然而&#xff0c;传统的工业机器人编程和操作需要专业知识&#xff…

Linux学习第二天

今天学习linuxC编程。首先要熟悉linux下编写c程序的过程。 编写程序Hello World! 首先创建存放程序的文件夹,如下图所示:接下来在创建一个文件夹来保存这节要编写的代码。指令:mkdir 3.1接下来我们要设置VIM编辑器的一些配置,比如设置tab的字符数为4、以及设置VIM编辑器的行…

SpringSecurity6 学习

学习介绍 网上关于SpringSecurity的教程大部分都停留在6以前的版本 但是&#xff0c;SpringSecurity6.x版本后的内容进行大量的整改&#xff0c;网上的教程已经不能够满足 最新的版本使用。这里我查看了很多教程 发现一个宝藏课程&#xff0c;并且博主也出了一个关于SpringSec…

《线性代数的本质》笔记10

10-特征值与特征向量特征向量几何含义:在一次特定的线性变换中没有脱离原本张成空间的向量。特征值即为这个特征向量在这次变换中缩放的比例。 推导: $$ A\vec{v}=\lambda\vec{v} $$ $$(A-\lambda\textit{I})\vec{v}=\vec{0}$$ $$det(A-\lambda\textit{I})=0$$ 但并非所有线…

ACPWorkbench_for_BP10

一、菜单 文件菜单包含导入导出所有参数&#xff0c;导出flashbin文件和退出操作。文件菜单显示如下&#xff1a; Import Audio Settings&#xff1a;从音频配置文件中导入音频参数。 Export Audio Settings&#xff1a;将音频设置导出为音频配置文件。 Export Flash Binary Fi…

目录遍历-基于Pikachu的学习

目录遍历 原理 目录浏览漏洞是由于网站存在配置缺陷,存在目录可浏览漏洞,这会导致网站很多隐私文件与目录泄露,比如数据库备份文件、配置文件等,攻击者利用该信息可以更容易得到网站权限,导致网站被黑。 Pikachu 打开题目就是两个超链接,我随便点了一个发现url发现变化,有…

Testing Egineer note:2024_5_5-day05-part01

版本控制器之svn介绍 1.svn介绍(版本控制工具) 1、svn的定义: svn是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式个管理。 2.snv的作用: 在项目中对需求规格说明书,测试用例,…

[UDS][OTA] 自定义 IntelHEX (IHEX) format read/write library in C

参考修改 参考github的MIT协议开源项目 ihex 改写的代码 https://gitee.com/liudegui/intelhex-c 修改点&#xff1a; 修改Makefile脚本&#xff0c;支持x86_X64平台和aarch64平台将默认读取行长度设置为16位删除与ihex和bin之间的转换无关的示例代码 十六进制描述 HEX格式…

9.前端——HTML详细

HTML详解 Hyper Text Markup Language (超文本标记语言) HTML5 W3C(万维网联盟World Wide Web Consortium) 国际中立性技术标准机构 W3C标准包括结构化标准语言(HTML,XML) 表现标准语言(CSS) 行为标准(DOM,ECMAScript)网页基本结构 <!--网页基本结构--> <!--D…

HCIP第二节

OSPF&#xff1a;开放式最短路径协议&#xff08;属于IGP-内部网关路由协议&#xff09; 优点&#xff1a;相比与静态可以实时收敛 更新方式&#xff1a;触发更新&#xff1a;224.0.0.5/6 周期更新&#xff1a;30min 在华为设备欸中&#xff0c;默认ospf优先级是10&#…

Stable Diffusion WebUI 中文提示词插件 sd-webui-prompt-all-in-one

本文收录于《AI绘画从入门到精通》专栏,订阅后可阅读专栏内所有文章,专栏总目录:点这里。 大家好,我是水滴~~ 今天为大家介绍 Stable Diffusion WebUI 的一款中文提示词插件 sd-webui-prompt-all-in-one,就像它的名字一样,该插件几乎涵盖了提示词相关的所有功能。 文章内…

(搬运)碳知识大全

碳交易的一个小例子: 年初,有两个公司A和B,A公司每年规定排放二氧化碳100吨/年,B也是规定排放二氧化碳100吨/年;政府发放给A的碳配额是100吨/年,发放给B的碳配额也是100吨/年;2)年底,A公司通过节能改造,仅排放二氧化碳80吨,多余的20吨二氧化碳配额,就可以在碳交易市…

Over-Permission-基于Pikachu的学习

越权漏洞 原理 该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定,一旦…

【喜报】科大睿智为武汉博睿英特科技高质量通过CMMI3级评估咨询工作

武汉博睿英特科技有限公司是信息通信技术产品、建筑智慧工程服务提供商。其拥有专注于航空、政府、教育、金融等多行业领域的资深团队&#xff0c;及时掌握最新信息通信应用技术&#xff0c;深刻理解行业业务流程&#xff0c;擅于整合市场优质资源&#xff0c;积极保持与高校产…

02_Modbus的功能码与报文详解

Modbus协议类型 Modbus从站四张表类型 主站常用功能码 Modbus TCP请求报文,功能码03Modbus TCP应答报文,功能码03 00 17为23个字节:请求长度加应答长度06+17=23; 14为20长度:14+06=20Modbus UDP请求报文,功能码03Modbus UDP应答报文,功能码03 Modbus RTU请求报文,功能…

Kubernetes-控制器

目录 一、ReplicationController 和 ReplicaSet 1.RC控制器 2.RS控制器 01.matchExpressions 匹配运算符 02. matchLabels 匹配标签 二、Deployment 1.命令行更新镜像版本 2.文件更新镜像版本 3.金丝雀部署 4.金丝雀标签部署 三、DaemonSet 四、Job 五、CronJob …

jenkins常用插件之Filesystem Trigger

安装插件 Filesystem Trigger 项目配置 验证 根据上述配置&#xff0c;当1.txt文件发生变化时&#xff0c;jenkins每分钟会进行检测&#xff0c;检测到后即进行任务构建&#xff0c;后续的具体操作可自行配置

爱普生S2D13V52快速实现车载显示屏高分辨率显示系统

随着时代的发展&#xff0c;汽车驾驶位前中央的显示屏承担的功能也越来越多&#xff0c;从一开始仅仅是显示仪表盘的信息&#xff0c;再到作为显示屏辅助倒车&#xff0c;再到如今和一块平板一样可公认娱乐&#xff0c;显示屏的大小有些时候成为了一辆车够不够好的体现。随着汽…

苹果挖走大量谷歌人才,建立神秘人工智能实验室;李飞飞创业成立「空间智能」公司丨 RTE 开发者日报 Vol.197

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…