双指针经典题目

目录

1089. 复写零

法一:用栈实现

法二:用双指针

202. 快乐数

11. 盛最多水的容器

611. 有效三角形的个数

LCR 179. 查找总价格为目标值的两个商品

15. 三数之和

18. 四数之和


1089. 复写零

题目链接:1089. 复写零 - 力扣(LeetCode)

法一:用栈实现

解题思路:

        ❁ 将遍历到的数据放入栈中

        ❁ 如果放入的数据为0,且栈中数据 < arr.size(),则再放入一个0

        ❁ 如果栈中数据 >= arr.size(),直接结束循环

        ❁ 将栈中的数据逆序(因为栈是先进后出)放入答案数组ans

class Solution {
public:// 用栈来实现void duplicateZeros(std::vector<int>& arr) {int size = arr.size();std::stack<int> st;int top = 0, i = 0;while (top < size) {st.push(arr[i]);top++;if (top < size && arr[i] == 0) {st.push(0);top++;}i++;}for (int i = 0; i < size; i++) {arr[size - 1 - i] = st.top();st.pop();}}
};

法二:用双指针

解题思路:

        ❁ 题目要求:原地操作

        ❁ 我们可以先思考异地的操作,然后发现可以定义一个cur指针和一个dest指针,cur指向原数组,dest指向答案数组,当cur指向的值为非0,则cur++, dest++,否则cur++, dest += 2

        ❁ 再由异地操作思考原地操作,但是发现当dest > cur时,会修改cur后面的值,导致答案错误 ----> 思路转换 ----> 转换为从后向前修改

        ❁ 需要我们先找到最后一个被放入答案数组的位置 -----> 也就是找到cur最后指向的位置

        ❁ 从后向前修改数组,arr[dest] = arr[cur],如果arr[cur] == 0,则arr[dest - 1] = arr[cur]

        ❁ 注意点:dest可能再修改数组前 = size,那将造成越界访问;而dest = size的原因是:cur最后指向的元素为0,因此在修改数组前,应该判断是否dest == size,如果满足,则将arr[size - 1] = 0, cur--, dest -= 2

如下代码用top替代上面的dest,用i替代上面的cur 

class Solution {
public:// 双指针实现void duplicateZeros(vector<int>& arr){int size = arr.size();int top = -1/*因为指向最后位置*/, i = 0;// 注意顺序// 找cur最后的位置// 1、判断cur位置的值// 2、根据cur的值移动dest// 3、判断dest的位置// 4、移动curwhile (i < size){if (arr[i] == 0)top++;top++;if (top >= size - 1)// 已经到达最后一个位置break;i++;}// 越界了,dest = sizeif (top == size){arr[size - 1] = 0;top -= 2;i--;}// 从后向前修改数组while (i >= 0 && top >= 0){arr[top] = arr[i];top--;if (arr[i] == 0){arr[top] = 0;top--;}i--;}}
};

202. 快乐数

题目链接:. - 力扣(LeetCode)

解题思路:       

1、实际上这是一个一定成环的问题,我以2为例,这个例子不会变成1

 

2、如果能变为1,也将陷入循环 

 

3、不管会不会变成1,都会陷入循环,我们只需要判断环内的数是不是为1就好了

4、既然变为环,我们就可以联想到判断链表是否成环的那个问题的解法:快慢指针

,在判断链表是否成环的那个问题中快指针每一次走两步,慢指针每一次走一步,而这一题,我们的慢指针只要计算每一位的平方和一次,而快指针要计算每一位的平方和两次

class Solution {
public:// 快慢指针int GetAns(int a) {int ans = 0;while (a) {ans += ((a % 10) * (a % 10));a /= 10;}return ans;}bool isHappy(int n) {int s = n, f = GetAns(n); // 因为如果s和f相等,则下面的循环进不去,因为一定成环,不用继续判断成环的位置// 获得成环时的入口数据// 如当n = 2时,入口数据为4while (s != f) {s = GetAns(s);f = GetAns(GetAns(f));}// 判断入口数据是否为1return s == 1;}
};

11. 盛最多水的容器

题目链接:. - 力扣(LeetCode)

这题太经典了,OI中的题目也常考 

解题思路:

        ⚀ 该题有点贪心思维,根据贪心的思想,我们容易知道,两边的柱子高度越高,盛的水会更容易多

        ⚁ 因此,我们可以用两个指针,一个指向开头,一个指向最后一个元素,然后每次移动较矮的那个指针即可

class Solution {
public:// 用双指针,一个指向左边,一个指向右边,移动更矮的那个指针int maxArea(vector<int>& height){int ret = 0;int l = 0, r = height.size() - 1;while (l < r){if (height[l] < height[r]){ret = max(ret, (r - l) * height[l]);l++;}else{ret = max(ret, (r - l) * height[r]);r--;}}return ret;}
};

611. 有效三角形的个数

题目链接:. - 力扣(LeetCode)

解题思路:

    双指针

    三角形的判断条件是:a + b > c

    所以我们可以先排序,然后固定c,a、b为双指针

    1、如果a + b > c:那么说明a和a到b之间的所有数据都满足a + b > c,因此 ret += b - a;

    同时移动b指针

    2、如果a + b <= c:那么说明a太小了,因此要找一个能满足a + b > c的a,因此要移动a指针

    当a和b指针重叠时,移动c,a定位到0位置,b定位为c的前面一个位置

// 判断是否为三角形:两个小边的和 > 第三边
class Solution {
public:int triangleNumber(vector<int>& nums){if (nums.size() < 3)return 0;int ret = 0;sort(nums.begin(), nums.end());int size = nums.size();int l = 0, r = size - 2;int ptr = size - 1;while (l < r){if (nums[l] + nums[r] > nums[ptr]){ret += r - l;r--;}else{while (l < r && nums[l] + nums[r] <= nums[ptr])l++;}if (l == r){ptr--;l = 0;r = ptr - 1;}}return ret;}
};

LCR 179. 查找总价格为目标值的两个商品

题目链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

原剑指offer:和为s的两个数

// 数组已经是升序了// 解法1 哈希:存数据 
// 解法2 双指针:查找
class Solution {
public:vector<int> twoSum(vector<int>& price, int target){int l = 0, r = 1;vector<int>ans(2);int size = price.size();while (r < size && price[l] + price[r] != target){if (price[l] + price[r] > target){l++;r = l + 1;continue;}r++;if (r == size){l++;r = l + 1;}}ans[0] = price[l];ans[1] = price[r];return ans;}
};

15. 三数之和

题目链接:. - 力扣(LeetCode)

解法汇总:

1、使用map,固定两个数,查找第三个数

超时超内存

2、排序 + 暴力枚举 + set去重

3、有序算法要想到:二分  或者 双指针

如果可以用双指针,就用双指针(可以降低时间复杂度)

可以运用两数之和 = target的做法,将三数之和转化为:固定一个数值nums[i],在其他元素中找和为target3 - nums[i]

这个固定的数值就可以用循环遍历数组来实现

class Solution {
public:// 3、双指针// 先排序,再遍历i,固定i,先判断nums[i] == nums[i - 1],等于就要continue跳过(去重操作)// 另外l指针为i + 1,r为size - 1,// 1、如果和 > 0,l++// 2、如果和 < 0,r--// 如果和 = 0,加入答案数组,并去重vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>>ans;if (nums.size() < 3)return ans;int size = nums.size();for (int i = 0; i < size - 2; i++){if (nums[i] > 0)return ans;// 去重if (i > 0 && nums[i] == nums[i - 1])continue;int l = i + 1, r = size - 1;while (l < r){int sum = nums[i] + nums[l] + nums[r];if (sum > 0)r--;else if (sum < 0)l++;else{ans.push_back({nums[i], nums[l], nums[r]});// 去重while (l < r && nums[l + 1] == nums[l])l++;while (l < r && nums[r - 1] == nums[r])r--;l++;r--;}}}return ans;}
};

18. 四数之和

题目链接:. - 力扣(LeetCode)

解题思路:

        四数之和 转化为 三数之和,三数之和 转化为 两数之和

//注意:不重复/*法一:双指针法,l,r,i,j*/
// 与三数之和类似,无非多了一层循环
class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>>ans;if (nums.size() < 4)return ans;sort(nums.begin(), nums.end());int size = nums.size();for (int i = 0; i < size - 3; i++){if (i > 0 && nums[i] == nums[i - 1])continue;for (int j = i + 1; j < size - 2; j++){if (j > i + 1 && nums[j] == nums[j - 1])continue;int l = j + 1, r = size - 1;while (l < r){long long sum = (long long)/**/nums[i] + nums[j] + nums[l] + nums[r];if (sum < target)l++;else if (sum > target)r--;else{ans.push_back({nums[i], nums[j], nums[l], nums[r]});while (l < r && nums[l + 1] == nums[l])l++;while (l < r && nums[r - 1] == nums[r])r--;l++;r--;}}}}return ans;}
};

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

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

相关文章

【模板进阶】类模板中可变参的特殊继承方式

本篇博客主要介绍在类模板中可变参数的特殊继承方式和展开方式。 回顾之前的可变参展开&#xff1a;可变参模板 一、父类 首先&#xff0c;我们有一个父类&#xff0c;是一个可变参类模板&#xff0c;如下&#xff1a; //父类 template<typename...Args> class myclass…

windows cuda12.1 pytorch gpu环境配置

安装cuda12.1 nvcc -V conda创建pythong3.10环境 conda create -n llama3_env python3.10 conda activate llama3_env 安装pytorch conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia gpu - Pytorch version for cuda 12.2 - Stack Ov…

MySQL面试不翻车指南:轻松掌握数据库秘籍

写在前面 &#x1f525;我把后端Java面试题做了一个汇总&#xff0c;有兴趣大家可以看看&#xff01;这里&#x1f449; ⭐️在无数次的复习巩固中&#xff0c;我逐渐意识到一个问题&#xff1a;面对同样的面试题目&#xff0c;不同的资料来源往往给出了五花八门的解释&#…

大屏幕导入名单电话等数据滚动抽奖制作教程_姓名电话号码数字滚动抽奖产品

原文地址 在当今数字化时代&#xff0c;抽奖活动也紧跟潮流&#xff0c;不断进行创新。导入数据滚动抽奖产品就是其中一种令人耳目一新的抽奖方式&#xff0c;它不仅提高了抽奖的公平性和透明度&#xff0c;还给参与者带来了全新的体验。导入数据滚动抽奖产品的优势&#xff1a…

[Linux]常用操作指令

实用指令 1.指定运行级别 查看当前运行级别 切换运行级别 设置默认运行级别 2.找回root密码 3.帮助指令 查看ls命令的帮助信息 列出文件, 包含隐藏文件 单行展示信息 命令可以组合使用 获得cdn内置命令的帮助信息 4.文件目录指令 5.组管理和权限管理 所有者 所在组

鸿蒙 WebView 如何 Debug

前置&#xff1a; hdc chrome //----------------------------------------------------------------------------------------------- hdc shell cat /proc/net/unix | grep devtools 0: 00000002 0 10000 1 1 81134005 webview_devtools_remote_62479exit执行&…

【java面经速记】Mysql和ES数据同步

目录 Mysql业务数据库 ES查询数据库 数据同步方案 同步双写 异步双写&#xff08;MQ方式&#xff09; 基于Mysql的定时扫描同步 基于Binlog实时同步 使用canal监听binlog同步数据到es&#xff08;流行方案&#xff09; 拓展:mysql的主从复制原理 canal原理&#xff1a…

通信工程学习:什么是NFVI网络功能虚拟化基础设施层

NFVI&#xff1a;网络功能虚拟化基础设施层 NFVI&#xff08;Network Functions Virtualization Infrastructure&#xff09;即网络功能虚拟化基础设施层&#xff0c;是NFV&#xff08;Network Functions Virtualization&#xff0c;网络功能虚拟化&#xff09;架构中的一个重要…

PS相关操作记录

1. 磨皮步骤 1.1. 图层操作 先对照片进行去瑕疵、液化等操作&#xff0c;操作完的图层&#xff0c;重命名为液化&#xff0c;方便识别。复制两个图层&#xff0c;分别改为“低频”、“高频”&#xff0c;低频在下&#xff0c;高频在上。选中“低频”图层&#xff0c;滤镜 -&g…

midjourney 网页版收费页面

网页版体验了一个月&#xff0c;感觉确实方便很多 midjourney 网页版地址https://www.midjourney.com/archive 主要是左下角进行相关设置 付费以后&#xff0c;记得在edit里面取消续费&#xff0c;取消后如图所示&#xff0c;我这个月用完&#xff0c;这个时间是即时的&…

嵌入式C语言自我修养:GNU C编译器扩展语法精讲

在Linux内核的源码中&#xff0c;你会发现许多这样的“奇特”代码。它们看起来可能有点陌生&#xff0c;但它们实际上是C语言的一种扩展形式&#xff0c;这种扩展在C语言的标准教材中往往不会提及。这就是为什么你在阅读Linux驱动代码或内核源码时&#xff0c;可能会感到既熟悉…

java sdk下载,解决下载了java但是编译不了

直接搜Java得到的网站使用不了的 应该只是个功能包或者版本太低用不了 得去oracle公司搜java这个产品去下载

MySQL中去除重复

除去相同的行 SELECT DISTINCT 列名 FROM 表名; 示例&#xff1a;查询employees表&#xff0c;显示唯一的部门ID select distinct department_id from employees;

心理教育辅导系统:Spring Boot技术实现

4 系统设计 4.1系统概要设计 高校心理教育辅导系统主要分为管理员、教师和学生三个角色&#xff0c;系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet&#xff0c;便可以在任…

论文阅读:Omni-Kernel Network for Image Restoration

论文地址&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/27907 项目地址&#xff1a;https://github.com/c-yn/OKNet 发表时间&#xff1a;2024 图像恢复的目的是从一个退化的低质量的观测中重建一个高质量的图像。最近&#xff0c;Transformer模型由于其强大…

本地快速部署一个简洁美观的个人Halo博客网站并发布公网远程访问

文章目录 前言1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 前言 本文主要介绍如何在Cen…

[系列]参数估计与贝叶斯推断

系列 点估计极大似然估计贝叶斯估计&#xff08;统计学&#xff09;——最小均方估计和最大后验概率估计贝叶斯估计&#xff08;模式识别&#xff09;线性最小均方估计最小二乘估计极大似然估计&贝叶斯估计极大似然估计&最大后验概率估计线性最小均方估计&最小二乘…

【鸿蒙开发 day13】

ArkTs-核心-基础 一.处理数据1.字符串的拼接2.模板字符串 二.类型转换(1)字符串转数字(2)数字转字符串(3)布尔值转换情况 三.交互点击事件四.状态管理五.隐藏图片案例六.运算符1.算数运算符2.赋值运算符3.一元运算符4.比较运算符5.逻辑运算符6.运算符优先级 七.美团点餐案例八.…

游戏开发团队并非蚂蚁协作(3):开发过程中的“尾气”

“尾气”指的什么&#xff1f; 就像汽车虽然行驶到达目的&#xff0c;但是却会在路途中留下尾气污染环境。开发过程中有时虽然完成了需求&#xff0c;但是也留下了“尾气”&#xff0c;或者说“技术债”、“遗留问题”。 “尾气”并不是看不到或者难以被解决&#xff0c;而是…

【Linux】常用指令详解一(ls,-a,-l,-d,cd,pwd,mkdir,touch,rm,clear)

1.前言 读了一些Linux常用指令的博文&#xff0c;很可惜没读到一点点手把手教怎么操作的博文&#xff0c;所以写一篇手把手教适合初学者的Linux常用指令博文 Linux的命令是树状结构 输入这一句命令&#xff1a;yum install -y tree 即可以查看Linux树状目录结构 查看示例&am…