【算法——双指针】

news/2024/9/22 16:50:28 标签: 算法, 数据结构

922. 按奇偶排序数组 II

算法讲解050【必备】双指针技巧与相关题目_哔哩哔哩_bilibili

main:
    vector<int>nums = { 3,1,2,4 };
    int i = 0, j = 1;
    int n = nums.size() - 1;
    while (j < nums.size() && i < nums.size())   //如果奇偶任一方排好了,另一方自然排好了
    {
        //判断最后一个元素奇偶
        if (nums[n] % 2 != 0) {
            swap(nums[j], nums[n]);    
            j += 2;  //来到下一个奇数位置
        }
        else {
            swap(nums[i], nums[n]);
            i += 2;  //来到下一个偶数位置
        }
    }

287. 寻找重复数

快慢指针

算法讲解050【必备】双指针技巧与相关题目_哔哩哔哩_bilibili

main:
	vector<int>nums = {}; 
	int slow = nums[0];
	int fast = nums[nums[0]];
	while (slow != fast)     //一开始快指针一次2步,慢指针一次1步
	{
		fast = nums[nums[fast]];
		slow = nums[slow];
	}
	fast = 0;    //二者第一次相遇后,快指针重置为初始位置
	while (slow != fast)     //快慢都一次一步
	{
		fast = nums[fast];
		slow = nums[slow];
	}
	//最后返回fast和slow都可以

42. 接雨水

算法讲解050【必备】双指针技巧与相关题目_哔哩哔哩_bilibili

思想:每个格子上方的水量进行累加,首先求这个格子左边的最大格子和右边的最大值。

如果左边比右边小,那么左边就是一个兜底,我当前格子装水量就是左减当前格子数。

右比左小同理,右边就是兜底。

总结:

	min(left_max, max_right)-nums[i]
特例:当前格子数比左右都大,就直接为0,这时候没有人兜底了
最终式子:max(min(left_max, max_right)-nums[i],0)

两侧最大值怎么求? 

main
	vector<int>nums = { 0,1,0,2,1,0,1,3,2,1,2,1 };
	int n = nums.size();
	vector<int>lmax(n);
	lmax[0] = nums[0];
	for (int i = 1; i < n; i++)        //左侧最大值不断继承
		lmax[i] = max(nums[i], lmax[i - 1]);

	vector<int>rmax(n);
	rmax[n - 1] = nums[n - 1];
	for (int i = n - 2; i >= 0 ; i--)   //右侧最大值不断继承
		rmax[i] = max(nums[i], rmax[i + 1]);

	int sum = 0;
	for (int i = 1; i < n - 1; i++)     //计算
		sum += max(min(lmax[i - 1], rmax[i + 1]) - nums[i], 0);

	cout << sum;


http://www.niftyadmin.cn/n/5670612.html

相关文章

Python基础 | 在虚拟环境中安装并在指定文件夹中打开Jupyter notebook

在虚拟环境中安装并在指定文件夹中打开Jupyter notebook 前言一、在虚拟环境下安装Jupyter notebook二、在指定路径下打开Jupyter notebook 前言 Jupyter Notebook 是一个基于 Web 的交互式计算环境&#xff0c;主要功能是将代码、文本、数学方程式、可视化和其他相关元素组合…

SkyWalking 环境搭建部署

架构简介 skywalking agent : 和业务系统绑定在一起,负责收集各种监控数据skywalking oapservice : 是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapserv…

MySQL高阶之存储过程

什么是存储过程? 存储过程可称为过程化SQL语言&#xff0c;是在普通SQL语句的基础上增加了编程语言的特点&#xff0c;把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中&#xff0c;通过逻辑判断、循环等操作实现复杂计算的程序语言。 换句话说&#xff0c;存储过程其实…

技术周总结 09.16~09.22 周日(架构 C# 数据库)

文章目录 一、09.16 周一1.1&#xff09;问题01&#xff1a; 软件质量属性中"质量属性场景"、"质量属性环境分析"、"质量属性效用树"、"质量属性需求用例分析"分别是什么&#xff1f;1.2&#xff09;问题02&#xff1a; 软件质量属性中…

[数据集][目标检测]文本表格检测数据集VOC+YOLO格式6688张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6688 标注数量(xml文件个数)&#xff1a;6688 标注数量(txt文件个数)&#xff1a;6688 标注…

王道考研视频——操作系统笔记

操作系统第一章&#xff01;入门 王道考研视频——操作系统笔记&#xff0c;第一部分&#xff0c;操作系统的概念和体系结构 0.0 课程白嫖指南_哔哩哔哩_bilibili0.0 课程白嫖指南是王道计算机考研 操作系统的第1集视频&#xff0c;该合集共计84集&#xff0c;视频收藏或关注UP…

刷题训练之栈

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握字符串算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

gbase8s数据库常见的索引扫描方式

1 顺序扫描&#xff08;Sequential scan&#xff09;&#xff1a;数据库服务器按照物理顺序读取表中的所有记录。 常发生在表上无索引或者数据量很少或者一些无法使用索引的sql语句中 2 索引扫描&#xff08;Index scan&#xff09;&#xff1a;数据库服务器读取索引页&#…