【优先算法】双指针

✨✨欢迎大家来到Celia的博客✨✨

🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉

所属专栏:优先算法

个人主页:Celia's blog~

目录

​​​​​​移动零

复写零

快乐数

盛水最多的容器

有效三角形个数

查找价值为目标值的两个商品

三数之和

四数之和




​​​​​​移动零

通过维护两个指针将数组分为三个部分:

  • 非零
  • 全零
  • 未处理

保证各个区间的要求不变:

  • cur指向的值为0, cur++
  • cur指向的值不为0,由于des本身的位置的值不为0,所以先要des++,再交换两个位置的值。
  • cur++,移动到下一个位置,以保证区间特点要求。

class Solution {
public:void moveZeroes(vector<int>& nums){int cur = 0, prev = -1;while(cur < nums.size()){if(nums[cur]){prev++;swap(nums[prev], nums[cur]);cur++;}else{cur++;}}    }
};

复写零

需要先模拟遍历,确定从哪一个位置开始复写(有特殊情况需要额外处理)。再从后向前遍历,进行复写。

class Solution {
public:void duplicateZeros(vector<int>& arr){int cur = 0, prev = -1;int n = arr.size();while(cur < n){if(arr[cur]) prev++;else prev += 2;if(prev >= n - 1) break;cur++;}if(prev >= n){arr[n - 1] = 0;prev -= 2;cur -= 1;}while(cur >= 0){if(arr[cur]) arr[prev--] = arr[cur--];else {arr[prev--] = 0;arr[prev--] = 0;cur--;}}}
};

快乐数

 把数字变化的过程抽象两种成环链表

  • 环中全为1
  • 环中不是1

一次计算来模拟链表的一次向后遍历,使用快慢指针来找到相交节点,并判断该节点的值。

class Solution {
public:int change(int num){int tmp = 0;while(num){int x = num % 10;tmp += x * x;num /= 10;}return tmp;}bool isHappy(int n) {int low = n, fast = change(n);while(low != fast){low = change(low);fast = change(fast);fast = change(fast);}if(low == 1) return true;return false;}
};

盛水最多的容器

 先定位最左最右节点。

若r向左移动:

  • 长度一定减小
  • 若是遇到比r节点高的,高度不变(由于取最小)。
  • 若是遇到比r节点小的,高度减小(由于取最小)。
  • 所以r,l中小的那一个无论怎么移动,总体积都在减小。没有必要继续遍历。
  • 故只要移动l,r中最小的那一个,就可以不断尝试其他的结果。

class Solution {
public:int maxArea(vector<int>& height){int l = 0, r = height.size() - 1;int maxV = 0;while(l < r){int V = min(height[l], height[r]) * (r - l);if(V > maxV) maxV = V;if(height[l] < height[r]) l++;else r--;}return maxV;}
};

有效三角形个数

 判断三角形的方法:

  • 两边之和大于第三边,判断三次
  • 有序:判断一次

故选择有序的情况进行三角形判断。先对数组进行排序,取一个最大的边(最后一个数组元素开始,依次向后移动)。再定义l,r分别在0位置和max-1位置处。

  • 若是l和r的和大于max,由于数组有序,l之后的元素必然都符合要求,共有r-l个结果。此时r的所有情况统计完毕,将r向左移动一位。
  • 若是l和r的和小于max,由于数组有序,l之后的元素必然都不符合要求,无结果。此时l的所有情况统计完毕,将l向右移动一位。
  • 当l >= r时,一轮遍历结束,将max向左移动一位,继续上述操作。

class Solution {
public:int triangleNumber(vector<int>& nums){sort(nums.begin(), nums.end());int max = nums.size() - 1;int count = 0;while(max >= 2){int l = 0, r = max - 1;while(l < r){if(nums[l] + nums[r] > nums[max]) count += r - l, r--;else l++;}max--;}return count;}
};

查找价值为目标值的两个商品

利用数组有序的特点,用两个指针快速遍历数组,找到结果后立即返回即可。

  • l和r的和小于目标值:l和最大的元素相加小于目标值,那么当前l右边的值都必然不符合要求,l++。
  • l和r的和大于目标值:r和最小的元素相加大于目标值,那么当前r左边的值都必然不符合要求,r--。

class Solution {
public:vector<int> twoSum(vector<int>& price, int target){int l = 0,r = price.size() - 1;while(l < r){if(price[l] + price[r] > target) r--;else if(price[l] + price[r] < target) l++;else break;}return {price[l], price[r]};}
};

三数之和

  • 与上一题思路大致相同,但必须保证数组有序,故需要先排序。
  • 并且这道题需要例出所有情况,不能找到马上返回,需要继续遍历。
  • 所有的情况不能有重复,所以移动所有指针时需要跳过重复的元素。

此题相比两个数多了一个数:

  • 先固定一个数
  • 再将剩余的两个数,用“两个数的和”这道题的方法来做(双指针)。
  • 之后大体框架相同,需要注意一些细节(越界问题、去重、不漏可能情况)。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums){sort(nums.begin(), nums.end());vector<vector<int>> vv;int cur = 0;while(cur < nums.size() - 2){int l = cur + 1, r = nums.size() - 1;while(l < r){int tmp = nums[l] + nums[r] + nums[cur];if(!tmp){vv.push_back({nums[l], nums[r],  nums[cur]});r--, l++;while(l < r && r >= 0 && nums[r] == nums[r + 1]){r--;}while(l < r && l < nums.size() && nums[l] == nums[l - 1]){l++;}}else if(tmp > 0){r--;while(l < r && r >= 0 && nums[r] == nums[r + 1]){r--;}}else{l++;while(l < r &&(l < nums.size() && nums[l] == nums[l - 1])){l++;}}}cur++;while(cur < nums.size() && nums[cur] == nums[cur - 1]){cur++;}}return vv;}
};

四数之和

此题在三个数的基础上多了一个数:

  • 固定两个数
  • 剩下两个数按照双指针思路来做,大体框架一模一样。

此题需要注意数组元素的大小容易过大,导致计算溢出,所以需要采用两两相加的方式来比较大小。

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target){vector<vector<int>> vv;int n = nums.size();sort(nums.begin(), nums.end());int a = 0;while(a < n - 3){int b = a + 1;while(b < n - 2){int l = b + 1, r = n - 1;long long aim = (long long)target -  nums[a] - nums[b];while(l < r){long long sum = nums[l] + nums[r];if(sum == aim){vv.push_back({nums[a], nums[b], nums[l], nums[r]});l++, r--;while(l < r && nums[l] == nums[l - 1]) l++;while(l < r && nums[r] == nums[r + 1]) r--;}else if(sum < aim) l++;else r--;}b++;while(b < n - 2 && nums[b] == nums[b - 1]) b++;}a++;while(a < n - 3 && nums[a] == nums[a - 1]) a++;}return vv;}
};

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

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

相关文章

Apache配置案例二:基于域名的虚拟主机搭建

文章目录 前言一、任务要求&#xff1a;二、任务分析&#xff1a;二、任务步骤&#xff1a;总结 前言 基于域名的虚拟主机搭建&#xff0c;涉及诸多知识点&#xff0c;一是域名服务器的搭建配置&#xff0c;前面的博文《图示详解OpenEuler下 DNS安装、配置与测试》、《图示详解…

如何选择适合自己的 Python IDE

集成开发环境&#xff08;IDE&#xff09;是指提供广泛软件开发能力的软件应用程序。IDE 通常包括源代码编辑器、构建自动化工具和调试器。大多数现代 IDE 都配备了智能代码补全功能。在本文中&#xff0c;你将发现目前市场上最好的 Python IDE。 什么是 IDE&#xff1f; IDE…

开源项目-投票管理系统

哈喽&#xff0c;大家好&#xff0c;今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页&#xff0c;发起投票&#xff0c;管理投票&#xff0c;参与投票&#xff0c;查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户…

OpenSSL

OpenSSL 概述 OpenSSL 是一个开源的、安全传输协议实现工具&#xff0c;广泛应用于数据加密与解密、证书生成与管理以及其他安全性相关的任务。在现代网络安全中&#xff0c;OpenSSL 被用于构建和维护 SSL/TLS 通信&#xff0c;确保数据在传输过程中的机密性和完整性。 简单来…

ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用

本文整理于 2024 年云栖大会阿里云智能集团高级技术专家金吉祥&#xff08;牟羽&#xff09;带来的主题演讲《ApsaraMQ Serverless 能力再升级&#xff0c;事件驱动架构赋能 AI 应用》 云消息队列 ApsaraMQ 全系列产品 Serverless 化&#xff0c;支持按量付费、自适应弹性、跨可…

fmql之Linux以太网

正点原子第57章。 dts fmql-dtsi&#xff1a; 我们用的PHY芯片是RTL8211F&#xff1a; 需要添加PHY信息&#xff1a; fmql-dtsi提供的参考&#xff1a; 根据vivado工程自动生成的&#xff1a; reg <0x1>; 配置 疑问 网口通讯需要网线&#xff0c;但是目前板卡上只有PS…

Java面试经典 150 题.P26. 删除有序数组中的重复项(003)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) …

在 Elasticsearch 中顺利管理季节性时间变化

作者&#xff1a;来自 Elastic Valeriy Khakhutskyy, James Gowdy 用于 Elasticsearch 异常检测的新夏令时日历。 每年春季和秋季两次&#xff0c;许多国家/地区都会调整时钟以更好地利用日光。这些时钟调整不仅会带来时差和 “困倦的星期一” 的感觉&#xff0c;还会带来来自…

Qt——信号和槽

一.信号和槽概述 谈及信号&#xff0c;很容易联想到在Linux系统中所分享到的信号。那么Linux信号和Qt信息有什么不同&#xff1f; 在 Qt 中&#xff0c;用户和控件的每次交互过程称为⼀个事件。比如 "用户点击按钮" 是⼀个事件&#xff0c;"用户关 闭窗口&quo…

必胜客万圣节“邪恶鬼手披萨”,品牌营销的“鬼”才之作!

在万圣节的神秘氛围下&#xff0c;各大品牌纷纷推出创意营销活动&#xff0c;试图在这个充满奇幻色彩的节日里捕获消费者的心。其中&#xff0c;必胜客推出的“邪恶鬼手披萨”无疑是一次令人拍案叫绝的品牌营销“鬼”才之作&#xff0c;它不仅巧妙地融合了节日元素&#xff0c;…

3D Gaussian Splatting代码详解(一):模型训练、数据加载

1 模型训练 def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint, debug_from):first_iter 0# 初始化高斯模型&#xff0c;用于表示场景中的每个点的3D高斯分布gaussians GaussianModel(dataset.sh_degree)# 初始化…

[MySQL#6] 表的CRUD (1) | Create | Retrieve(查) | where

目录 1. 插入 1.1 单行数据 - 全列插入 指定列插入 1.2 多行数据 - 全列插入 指定列插入 1.3 更新 1.4 替换 2. 查找 2.1 select 列 2.2 where 条件 具体案例 2.3 结果排序 总结关键字执行顺序 2.4 筛选分页结果 CRUD : Create(创建)&#xff0c;Retrieve(读取)&…

[机器学习]集成学习

1 集成学习 强强联合、弱弱变强Bagging&#xff08;平权投票&#xff09;&#xff1a;随机森林Boosting&#xff08;加权投票&#xff09;&#xff1a;Adaboost、GBDT、XGBoost、LightGBM 2 随机森林 3 Adaboost 放大错误数据&#xff0c;缩小正确数据

第三十三篇:TCP协议如何避免/减少网络拥塞,TCP系列八

一、流量控制 一般来说&#xff0c;我们总是希望数据传输得更快一些&#xff0c;但是如果发送方把数据发送得太快&#xff0c;接收方可能来不及接收&#xff0c;造成数据的丢失&#xff0c;数据重发&#xff0c;造成网络资源的浪费甚至网络拥塞。所谓的流量控制&#xff08;fl…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

数据结构---链表(一)【不带头单向非循环】

文章目录 链表概念链表的使用LinkedList 的几种遍历方式单链表的模拟实现&#xff08;不带头&#xff09;链表面试题 观察ArrayList 顺序表的源码发现&#xff0c;底层是使用数组实现的。由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xf…

Pytorch(一)

一.PyTorch环境配置及安装 1.1 工具安装 1.1.1 Anaconda下载 清华大学镜像站下载&#xff0c;版本为Anaconda3-5.2.0-Windows-x86_64&#xff08;对应python3.6.5&#xff09; Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 1.1.2…

关于我的数据结构与算法——初阶第二篇(排序)

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09;。 排序的概念及其运…

AI驱动的低代码未来:加速应用开发的智能解决方案

引言 随着数字化转型的浪潮席卷全球&#xff0c;企业对快速构建应用程序的需求愈发强烈。然而&#xff0c;传统的软件开发周期冗长、成本高昂&#xff0c;往往无法满足快速变化的市场需求。在此背景下&#xff0c;低代码平台逐渐成为开发者和企业的优选方案&#xff0c;以其“低…

三周精通FastAPI:21 子依赖项和路径操作装饰器依赖项

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/dependencies/sub-dependencies/#_6 子依赖项 FastAPI 支持创建含子依赖项的依赖项。 并且&#xff0c;可以按需声明任意深度的子依赖项嵌套层级。 FastAPI 负责处理解析不同深度的子依赖项。 第一层依赖项 …