首页 > 其他分享 >快慢指针

快慢指针

时间:2024-02-01 19:44:09浏览次数:27  
标签:快慢 cnt int num 区间 指针

快慢指针

指两个指针从同一侧开始遍历序列,且移动步长一个快一个慢,快的为快指针,慢的为慢指针。称快指针为r,慢指针为l,构成区间[l,r]。直到满足某些条件时为止。

求解步骤

l一般为1,r一般为0,即初始区间为[1,0],表示空区间。
满足一定条件时慢指针右移,满足另一条件时快指针右移,保证区间合法。
满足其他条件时跳出循环体。

例题

挑选字串

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1e5 + 10;

int num[N] = { 0 };

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n, m, k;
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++) {
		cin >> num[i];
	}

	int ans = 0;

	for (int i = 1, j = 0, cnt = 0; i <= n; i++) {
		while (i > j || (j + 1 <= n && cnt < k))cnt += (num[++j] >= m);//不管最后的逻辑表达式对不对,j都会自增1。while的目的是找到合法区间。
		if (cnt >= k)ans += n - j + 1;
		cnt - (num[i] >= m);//进入下一循环,i要加一了,故cnt要把一开始的数减掉
	}

	cout << ans << '\n';

	return 0;
}

标签:快慢,cnt,int,num,区间,指针
From: https://www.cnblogs.com/breadcheese/p/18001990

相关文章

  • 代码随想录算法训练营第九天| 28. 实现 strStr() 459.重复的子字符串 字符串总结 双
     28.实现strStr()给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从0开始)。如果 needle 不是 haystack 的一部分,则返回  -1 。题目链接:28.找出字符串中第一个匹配项的下标-力扣(LeetCode)思路:标......
  • 指针扫描型字符串算法
    【最小表示法】最小表示法循环表示:从一个位置开始向后遍历,到末尾再倒回去最前面。一个字符串(数组)一共有\(n\)个。最小表示法就是最小的循环表示。例如,31491的最小表示法是13149.如果我们用打擂台比大小的方式,因为字符串之间比较需要时间,总共是\(O(n^2)\)的,太慢......
  • CEIT算法训练-双指针部分题解(T1-3)
    AnagramSearch题意简述两个字符串\(s\)和\(t\)相似的定义为:\(s\)可以打乱之后重新排列成为\(t\)。题目给出\(a\)和\(b\),问\(a\)中有多少子串(连续的一段)与\(b\)相似。同时,\(a\)中还含有\(?\)字符,他可以等价于任何字符(可以变成任何字符)解题思路实际上,根据题......
  • C 指针1
    phello.c#include<stdio.h>voidincrement(int*p);//提前声明increment函数intmain(void){printf("index-----------start\n");intb=0;//初始化b的值increment(&b);//传递b的地址给increment函数printf("b1is%i\n"......
  • C 数组形参会退化成指针
    数组形参会退化成指针,指向数组的第一个元素。#include<stdio.h>voidShowBooksName(char*names[],intlen){for(inti=0;i<len;++i){puts(names[i]);}}voidTestSizeOf(char*books[]){//数组形参退回成指针,指向数组中的第一个元素......
  • 双指针
    似乎比较useless,暂时就浅尝辄止概述找到答案的单调性,把原来多重循环嵌套\(O(n^2)\)的枚举优化成双指针维护的\(O(n)\)枚举。//暴力for(inti=0;i<n;i++)for(intj=0;j<n;j++){ todo;}//双指针for(inti=0;j=0;i<n;i++){ whi......
  • C++类指针未初始化导致访问成员变量时报段错误
    #安装gcc和g++yuminstallgccyuminstallgcc-c++.x86_64//a.cpp#include<iostream>#include<unistd.h>usingnamespacestd;classTest{public:  voidtest1(){  }  voidtest2(){    age=10;  }private:  intage;}......
  • (坚持每天写算法)算法复习与学习part1基础算法part1-12——双指针算法
    双指针是一种思路,很多题都可能用得到,这里我就只选取Acwing网站的三道题(事实上我最近就是在这里刷题,leetcode反而不怎么去了,刷完这个网站的我就会去leetcode刷了)双指针一般来讲会在数组有序的情况下应用,但是如果是无序的也是有可能的,两个指针会遍历整个数组(如果条件允许的......
  • Spring中没有注入而是new导致空指针异常
    背景:在BeforeSave_2250042中调用了一个公共模块CommonVerifyHandler的verifySeal()方法,但是运行时显示空指针异常空指针异常:CommonVerifyHandler类:@ComponentpublicclassCommonVerifyHandler{@AutowiredpublicCommonVerifyHandlerMappercommonVerifyHandler......
  • Leetcode刷题第四天-双指针-二分法
    15:三个数之和链接:15.三数之和-力扣(LeetCode)em...双冲for循环,从头去遍历,0-(a+b)是否在列表中,最终timeout数组从小到大排序,设置三个指针,i从头遍历到lens-1,j从i+1开始,k从lens-1开始,sums==0,放入结果,大于0,k-1,小于0,j+1如果i和i+1比较,相同跳过的话,会丢结果,i和i-1相等跳过,因为i-1已......