双指针(基础思路):
新手入门:有序数组的平方
定义两个指针下标分别指向数组的第一个与最后一个元素,由于本身为有序数组所以通过下标元素的大小比较,将较大的元素存储到新的数组中并移动较大元素的下标,形成一个全新的有序数列,时间复杂度为O(n)。
蛇形矩阵:
四个坐标:
两个坐标:
注意:
循环次数(圈数):边长/2
if(边长为奇数){
在二维数组中心赋值最后的数;
}
队列:
典型问题:P7505 「Wdsr-2.5」小小的埴轮兵团 洛谷
#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include<bits/stdc++.h>
using namespace std;
long long int n,m,op,k,a[300005],x,w;
int main(){
scanf("%lld %lld %lld",&n,&m,&k);
long long int l=1,r=n;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+n+1);
for(int i=1;i<=m;i++){
scanf("%lld",&op);
if(op==3){
printf("%lld\n",r-l+1);
continue;
}
scanf("%lld",&x);
if(op==1){
w=w+x;
while(a[r]+w>k && l<=r){
r--;
}
}else if(op==2){
w=w-x;
while(a[l]+w<-k && l<=r){
l++;
}
}
}
}
注意:对时间复杂度的处理,无需每次对所有的元素进行值的变化,可以额外定义一个变量去记录多次变化后的元素值变化量。