双指针简单学习,要学疯了
简单的介绍
指针非c++/c里面的指针,而是通俗地讲是所以
那么通过两个索引一起弄,就可以将同时获取两个值,或者是获取一个区间,然后再对区间里面面的数字进行判断
一些分类以及心得
// 左右指针,对于非区间的计算
// 首先是定义左右指针
// 然后就是什么情况下左动,什么情况下右动
// 当然,也有情况就是中间往两边走
// 第二种就是滑动窗口,就是题目会要求一个区间
// 或者是好几个数字,这个时候可以进行排序,
// 然后就进行一个窗口滑动,并计算
// 首先都是同向而行
// 而一般,快指针是全部遍历的,而慢指针是根据条件来进行移动的
// 视情况而定,两个指针也会一起++哦!
// 但是一般而言,是不会有两次for循环的!!!
// 就是说你的快指针不会跑好几次,就是说两个指针都只会走一次
// 最典型的例题就是n数之和
// n>2,因为n=2的时候只有两个目标,这个时候左右指针就行了
// 不需要再弄一个窗口区间出来
// 先排序,那样子,你就知道要左加还是右减
// 不然的话,你不知道减了之后下一个数字是个什么东西捏
// 三数之和是不是只是比两数多了一个数字,那么我们可以使用for循环来代替这个数字
// 酱紫我们就可以确定了一个数字,然后再比这个数字大的数字里面寻找两数之和==这个数字的负数
// 所以也就是相当于左右指针了
// 然后剩下两数就有左右指针来完成,左指针要在for循环的i之后,因为前面的都已经没处理过了
// 太牛了
// 由于i是一直向前走的,并且left和right的区间是局限在i前面的
// 所以是根本不可能存在重复的情况,因为i这个数字的位置!!!是独一无二的
//而四数之和就是类似的,再嵌套多一个循环就可以了
// 而三数之和,这道题目的话,如果是从第一个数开始制造区间,那么就有可能会少了东西捏
// 所以每一个数字都要枚举,然后作为窗口的中心,有事一种很难的想法
题目以及题解
合并两个有序数组
验证回文串
反转字符串
完全二叉树的权值不知道,为什么下午写的时候好像是错的,刚才提交又对了。。。奇奇怪怪
不过貌似和双指针没什么关系,注意把握跳转的量就可以了
int main()
{
int len;cin >>len;
int record[len];
for (int i = 0; i < len; i++)
{
cin >>record[i];
}
int all=0,k=1,a=1,i=0;
long long temp=0;
long long res=record[0],resk=1;
while (all<len)
{
temp=0;
int flag=i;
for (i ; i < flag+a; i++)
{
temp +=record[i];
all++;
if (all==len)
{
break;
}
}
if (temp>res)
{
res=temp;
resk=k;
}
k++;
a = a*2;
}
cout << resk;
}
平方数之和直接用暴力了
快乐数还是直接暴力了
三数之和,但是不知道为什么编译错误了,再看看
vector<vector<int>>res;
int n = nums.size();
// 减少计算量
int left,right;
sort(nums.begin(),nums.end());
for (int i = 0; i < n-2; i ++)
// 因为要保留 最后的时候,左右指针的位置
{
if (i&&nums[i]==nums[i-1])
// 酱紫就除去了 0这样子左边无,无法判断的情况
{
continue;
}
if (nums[i]>0)
// 还有000的情况哦!!!
{
break;
}
left=i+1;
right=n-1;
while(left<right)
// 要不断地进行一个移动哦!!!
{ // 减少计算的次数,因为计算n次就会减少n次的计算!!!
int target = nums[left]+nums[right]+nums[i];
// ...是每一次都要重新第一捏
// 因为while循环里面是一个双指针!!!
if (target>0)
{
left--;
}
else if (target<0)
{
right++;
}
else
{
res.push_back({nums[left],nums[right],nums[i]});
left++;
right--;
// 换另外的两个数字,来算
// 就是相当于左右指针像中间靠拢
while (left<right&&nums[left]==nums[left-1])
{
left++;
}
while (left<right&&nums[right]==nums[right+1])
{
right--;
}
}
}
}
四数之和
期末判断