首页 > 编程语言 >【算法】双指针法

【算法】双指针法

时间:2023-12-24 22:56:38浏览次数:36  
标签:arr right int ++ 算法 left 指针

还记得A-B=C问题吗?在之前,我们把原序列排好序,然后变成A=B+C问题,枚举每一个元素作A,然后再序列里如果存在B+C,必然是连续的一段(一个也是),我们利用二分法以O(logN)的时间复杂度获得左右边界相减即可。现在介绍另一种方法:双指针法。

如上面说的,序列里如果存在B+C,必然是连续的一段。维护两个指针,左指针l和右指针r,使得s[l]是首个大于等于B+C的数,s[r]是首个大于B+C的数,这样,s[l]到s[r-1]都是等于B+C的数字,故等于B+C的数字共有r-l个,累加到ans里。

#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int N = 2e5 + 10;
int n , c;
int a[N];

int main () 
{
	cin >> n >> c;
	for(int i = 1 ; i <= n ; i ++) cin >> a[i];
	sort(a + 1 , a + 1 + n);
	int l = 1, r1 = 1 , r2 = 1;
	ll ans = 0;
	for(l = 1 ; l <= n ; l ++) {
		while(r1 <= n && a[r1] - a[l] <= c) r1 ++;  //首个大于B+C的下标
		while(r2 <= n && a[r2] - a[l] < c ) r2 ++;  //首个大于等于B+C的下标
		if(a[r2] - a[l] == c && a[r1 - 1] - a[l] == c && r1 - 1 >= 1) 	
			ans += r1 - r2;
	}
	cout << ans;
	return 0;
}

双指针算法本身的时间复杂度是O(n)。

双指针法本质是使用队列去维护一个符合条件的区间,右指针增加相当于入队,左指针增加相当于出队

来这里复习以下快速排序,一样也用到了两个指针维护区间

快速排序
 void Quick_sort (int arr[], int left, int right) {
    if (left >= right) {
        return;
    } //递归结束条件
    int Base_Value = arr[(left+right)/2]; //选择基准值
    int i = left - 1;
    int j = right + 1;

    while (i < j) {
        do
            i++;
        while (arr[i] < Base_Value);
        do
            j--;
        while (arr[j] > Base_Value);

        if (i < j)
            swap(arr[i], arr[j]);
    }
    Quick_sort (arr, left, j); //继续排左边的
    Quick_sort (arr, j + 1, right); //继续排右边的
}

 

例题2:

2816. 判断子序列 - AcWing题库

太简单了,直接看代码吧

#include <iostream>
using namespace std;

const int N = 1e5 + 10;
int a[N], b[N];

int main() {
	int n, m;
	cin >> n >> m;

	for (int i = 0; i < n; i++)
		cin >> a[i];
	for (int j = 0; j < m; j++)
		cin >> b[j];

	int i = 0;

	for (int j = 0; j < m; j++) {
		if (i < n && a[i] == b[j])
			i++;
	}
	if (i == n)
		cout << "Yes";
	else
		cout << "No";

	return 0;
}

 

总之:双指针算法的核心思想,运用某些单调性质将N方的朴素算法优化成N
此时每个指针遍历数字的次数不超过n先思考暴力做法,再思考双重循环中(暴力一般是两个for循环)的单调关系,得到优化做法。

 

一般模版如下:

for (int l = 0, r = 0; r < n; ++r)
{
	while (l < r && check(l, r)) ++r;
	// 每道题的具体逻辑
}

 

标签:arr,right,int,++,算法,left,指针
From: https://www.cnblogs.com/Yukie/p/17925007.html

相关文章

  • 人工智能和云计算带来的技术变革:从人工智能的算法到模型
    1.背景介绍人工智能(ArtificialIntelligence,AI)和云计算(CloudComputing)是当今最热门的技术领域之一。随着数据规模的增加、计算能力的提升以及算法的创新,人工智能技术的发展得到了重大推动。云计算则为人工智能提供了强大的计算资源和数据存储,从而使得人工智能技术的应用得以广泛......
  • 人工智能算法原理与代码实战:从机器学习到人工智能
    1.背景介绍人工智能(ArtificialIntelligence,AI)是计算机科学的一个分支,研究如何让计算机模拟人类的智能。人工智能的目标是让计算机能够理解自然语言、认识环境、学习新知识、解决问题、作出决策等。人工智能的发展涉及到多个领域,包括机器学习、深度学习、计算机视觉、自然语言处......
  • 人工智能算法原理与代码实战:从推荐系统到广告算法
    1.背景介绍人工智能(ArtificialIntelligence,AI)是一门研究如何让机器具有智能行为的科学。智能可以包括学习、理解自然语言、识别图像和视频、推理、决策等多种能力。人工智能算法是一种用于解决智能问题的算法,它们通常涉及大量数据、复杂的数学模型和高效的计算方法。在过去的几......
  • 人工智能算法原理与代码实战:从Docker到Kubernetes
    1.背景介绍人工智能(ArtificialIntelligence,AI)是计算机科学的一个分支,旨在模拟人类智能的能力,包括学习、理解自然语言、识别图像和视频、进行决策等。随着数据量的增加和计算能力的提高,人工智能技术的发展得到了巨大推动。在过去的几年里,我们看到了许多人工智能算法的创新和发展,如......
  • 人工智能算法原理与代码实战:强化学习与智能决策
    1.背景介绍强化学习(ReinforcementLearning,RL)是一种人工智能(ArtificialIntelligence,AI)技术,它旨在让计算机代理(agent)通过与环境(environment)的互动学习,以最小化惩罚或最大化奖励来达到目标。强化学习的核心思想是通过在环境中执行一系列动作来学习如何最佳地执行任务。强化学习......
  • 人工智能算法原理与代码实战:强化学习在游戏中的应用
    1.背景介绍强化学习(ReinforcementLearning,RL)是一种人工智能技术,它通过在环境中与其相互作用来学习如何做出决策的算法。在这种学习过程中,智能体通过试错学习,不断地尝试不同的行为,并根据收到的奖励来调整其行为。强化学习在游戏领域具有广泛的应用,例如人工智能棋牌、游戏AI等。在......
  • 人工智能算法原理与代码实战:从遗传算法到粒子群优化算法
    1.背景介绍人工智能(ArtificialIntelligence,AI)是一门研究如何让计算机模拟人类智能的学科。人工智能算法是人工智能系统中最核心的组成部分之一,它们可以帮助计算机解决复杂的问题,并找到最佳的解决方案。在本文中,我们将探讨两种常见的人工智能优化算法:遗传算法(GeneticAlgorithm,......
  • 人工智能算法原理与代码实战:图像处理的算法原理与实践
    1.背景介绍图像处理是人工智能领域中的一个重要分支,它涉及到将图像信息转换为数字信号,进行处理和分析,以实现各种应用。图像处理技术广泛应用于医疗诊断、安全监控、自动驾驶、人脸识别等领域。随着人工智能技术的发展,图像处理算法也不断发展和进步,从传统的图像处理算法到深度学习算......
  • 人工智能算法原理与代码实战:支持向量机与核方法
    1.背景介绍支持向量机(SupportVectorMachines,SVM)是一种常用的二分类和多分类的机器学习算法,它通过寻找数据集中的支持向量来将不同类别的数据分开。SVM的核心思想是将输入空间中的数据映射到高维空间,从而使数据更容易被线性分离。这种映射是通过核函数(kernelfunction)来实现的。......
  • 人工智能算法原理与代码实战:LDA主题模型介绍与实战
    1.背景介绍人工智能(ArtificialIntelligence,AI)是一门研究如何让计算机自主地完成人类智能任务的学科。人工智能算法是人工智能领域的核心内容之一,它旨在解决复杂问题,提高计算机的智能水平。在过去的几年里,人工智能算法已经取得了显著的进展,它们已经被广泛应用于各种领域,包括自然......