【优先算法】双指针

✨✨欢迎大家来到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.xdnf.cn/news/2245.html

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

相关文章

公务员考试需要注意哪些事项,这里简单的介绍一下

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一下公务员考试需要注意哪些事项。 公务员考试注意事项 公务员考试是许多求职者梦寐以求的职业生涯起点&#xff0c;但要成功通过这场竞争激烈的考试&#xff0c;需要做好充分的准备。以下是一些关键的注意事项&#xff…

[极客大挑战 2019]BabySQL 1

[极客大挑战 2019]BabySQL 1 审题 还是SQL注入和之前的是一个系列的。 知识点 联合注入&#xff0c;双写绕过 解题 输入万能密码 发现回显中没有or&#xff0c;猜测是使用正则过滤了or。 尝试双写绕过 登录成功 使用联合查询&#xff0c;本题中过滤了from&#xff0c;w…

Mac M1以非docker的方式运行 Elasticsearch 8

通过 docker 的方式部署运行 elasticsearch 当然是一个好的选择&#xff0c;当然除了这种方式我们也可以通过直接下载压缩包的方式进行部署运行。 一、访问官方下载压缩包 https://www.elastic.co/downloads/elasticsearch 进入页面后&#xff0c;网页会自动检测OS。 确认无…

Java项目实战II基于Java+Spring Boot+MySQL的体育馆使用预约平台的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着全民健…

【瑞吉外卖】-day03

目录 前言 启动禁用员工账号 消息转换器 1. Jackson (用于JSON) 2. JAXB (用于XML) 3. Gson (用于JSON) 4. MessagePack (用于二进制格式) 页面展示 代码部分 启动禁用员工账号修改&#xff08;个人意见&#xff09; 公共字段自动填充 ThreadLocal简要概述 基本用法…

blender导入的图片渲染看不见,图片预览正常,但渲染不出

在使用Blender时&#xff0c;我们经常会遇到导入图片后在预览渲染中显示&#xff0c;但在实际渲染时图片消失的问题。本文将提供详细的解决方法&#xff0c;帮助大家解决“Blender导入的图片渲染图像不显示”的问题。 问题原因 导入的图片在Blender中只是一张图&#xff0c;并…

本质矩阵分解计算Rt

1 本质矩阵的计算 上一文章中描述了本质矩阵的计算&#xff0c;计算机视觉-对极几何-CSDN博客&#xff0c;那么计算得到本质矩阵有什么用&#xff1f;其中一个应用是通过本质矩阵计算得到2D-2D的相对变换。 在相关矩阵计算时&#xff0c;一般会在两幅图像中&#xff0c;根据特征…

【天线&通讯】电力设施检测系统源码&数据集全套:改进yolo11-RFCAConv

改进yolo11-DAttention等200全套创新点大全&#xff1a;电力设施检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者…

MQTT自动发送消息工具(自动化测试MQTT)

点击下载《MQTT客户端服务端工具》 点击下载《MQTT自动发送消息软件(自动化测试MQTT)》 1. 前言 在软件开发过程中&#xff0c;MQTT常被用作消息队列来完成特定的业务功能。当我们将相关业务代码编写完成后&#xff0c;通常需要编写额外的消息生产和消费代码来模拟消息高峰时…

智慧医疗——提出了一种基于敌对领域适应症预测候选抗癌药物的方法

导言 本方法的研究背景和要点 据估计&#xff0c;未来每两个日本人中就有一人会患上癌症&#xff0c;它是现代人最难以治愈的疾病之一。众所周知&#xff0c;癌症的发生和发展是由于人类和其他动物的细胞生长机制遭到破坏&#xff0c;细胞变成了被称为癌细胞的特殊细胞。 癌…

算法|牛客网华为机试31-40C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试21-30C 文章目录 HJ31 单词倒排HJ32 密码截取HJ33 整数与IP地址间的转换HJ34 图片整理HJ35 蛇形矩阵HJ36 字符串加密HJ37 统计每个月兔子的总数HJ38 求小球落地5次后所经历的路程和第5次反弹的高度HJ39 判断两个IP是否属于同…

C/C++ 随机数生成方法

1. 使用 rand() 和 srand() - 库: <stdlib.h> 或 <cstdlib> - 特点: 伪随机数生成器&#xff0c;简单易用。 - 示例: #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); // 初始化随机数生成器 int random_nu…

AI大模型重塑软件开发:从代码自动生成到智能测试

随着AI技术的不断发展&#xff0c;AI大模型在软件开发领域的应用日益广泛。从代码自动生成到智能测试&#xff0c;AI大模型正在深刻改变着软件开发的各个环节&#xff0c;重塑着整个开发流程。本文将探讨AI大模型的定义、应用场景、优势以及挑战&#xff0c;并展望未来的发展趋…

Java的内部类

Java内部类 什么是内部类&#xff1f; 类的五大成员&#xff1a;属性、方法、构造方法、代码块、内部类在一个类的里面&#xff0c;再定义一个类 public class Outer { // 外部类class Inner { // 内部类} }public class Test { // 外部其他类public static void main(Strin…

WPF+MVVM案例实战(二十二)- 制作一个侧边弹窗栏(CD类)

文章目录 1、案例效果1、侧边栏分类2、CD类侧边弹窗实现1、样式代码实现2、功能代码实现3 运行效果4、源代码获取1、案例效果 1、侧边栏分类 A类 :左侧弹出侧边栏B类 :右侧弹出侧边栏C类 :顶部弹出侧边栏D类 :底部弹出侧边栏2、CD类侧边弹窗实现 1、样式代码实现 在原有的…

字符串算法

字符串 1.kmp匹配算法Anya and 1100 1.kmp匹配算法 模板题链接 不懂可以看这个~详细的思路 #include <string> #include <iostream>using namespace std; const int N 1000010;string s,p;// s[]是长文本&#xff0c;p[]是模式串&#xff0c;n是s的长度&#xff…

掌控板micropython编程实现OLED显示天气信息

掌控板micropython编程实现OLED显示天气信息 上一个例子已经实现了在掌控板的OLED上显示汉字&#xff0c;本例使用掌控板的wifi访问心知天气&#xff0c;获取天气信息显示在掌控板的OLED上。 访问心知天气主页&#xff08; https://www.seniverse.com/&#xff09;&#xff0…

golang通用后台管理系统03(登录校验,并生成token)

代码 package serviceimport ("fmt"//"fmt""gin/common""gin/config"sysEntity "gin/system/entity"sysUtil "gin/system/util""github.com/gin-gonic/gin""log" )func Login(c *gin.Contex…

三维测量与建模笔记 - 2.2 射影几何

教程中H矩阵写的有问题&#xff0c;上图中H矩阵应该是&#xff08;n1) x (m1) 共点不变性,下图中黄色方块标记的点&#xff0c;在射影变换前后&#xff0c;虽然直线的形状有所变化&#xff0c;但仍然相交于同一个点。 共线不变性&#xff0c;下图黄色标记的两个点&#xff0c;在…