手敲代码小总结——双指针

本文介绍了双指针作为一种解题思想,常用于优化算法效率,将O(n^2)降低到O(n)。文中详细列举了双指针在不同编程题目中的应用,包括易错点分析和特定问题的解决方案,如数据类型长度不足导致的错误。
摘要由CSDN通过智能技术生成

2.23、2.25、2.26、2.27、2.28

General:

1,<抄>建议:不要违背题解的思路好吗  累了。

2, 小错误~易错点~

改为

3,某测试点错误原因:还可能是定义的数据类型的长度不够

如int应该改为long long、int q[100]不够,应该至少是q[201]。

4,三指针不多见哦~

5,“指针不走回头路~”

6,思想方式:

都是一个指针不动,其他指针动,直到走到某个位置(自己根据题目设定),接着处理计数啥的;

之后把这个指针移动一个单位,其他指针动,直到走到某个位置(自己根据题目设定),接着处理计数啥的;

重复上述步骤~

7,500道洛谷,就差不多啦~

双指针笔记:

双指针并不是数据结构,也不是指C这种语言中的指针,而是一种解题思想,是一种简单的技巧,通过两个指针维护一些具有单调性、可快速增删的区间信息。

很多时候双指针的题,会有多种解法,但双指针解法往往是最清晰易懂的解法。双指针可用来提高效率,一般是将O(n^2)的时间复杂度,降为O(n)

双指针算法是指在遍历对象的过程中不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

核心思想:优化暴力(一般都是把暴力O(n^2或更多)优化到O(n))

for(int i = 1; i <= n; i ++)
{
    while(j <= i && check(i, j)) 
    {//check函数用来判断i,i 区间可不可取
        j ++;
    }
        //题目的具体逻辑
}

C:\Users\LQH!\Desktop\双指针

一、P1102 A-B 数对 100/100

题目:

<第一版><抄>建议:不要违背题解的思路好吗  累了。

mine:

题解:

<第二版>·双指针的拓展-》三指针 100/100

思路:A为a[i]时,使得在b1和b2之间的都是对应的B值。

问题一:小错误~易错点~

修改后:

问题二:数组长度不够

而我

修改后.全对~

问题三:之前做这题的时候老是错一个测试点,得92/100分

原因:“满足A−B=C 的数对的个数”使用int类型,不够,应该换成long long

二、AcWing800数组元素的目标和   未知得分

·对撞指针

题目:

三、AcWing1236递增三元组   未知得分

三指针

题目:

学习题解:

方法妙啊!

由暴力的方法,看出对b数组是公用的,选择b数组进行枚举,作为枢纽

for (int a = 1, b = 1, c = n; b <= n; b++)
	{
		while (a <= n && A[a] < B[b])
			a++;
		while (c >=1 && B[b] < C[c])
			c--;
		res += (a - 1) * (n - (c + 1) + 1);
	}

四、P3143 [USACO16OPEN] Diamond Collector S

题目:

问题一:情况:30/100   不断debug后发现原因:同一个钻石不能放在两个架子上。我当然知道,但是在有些测试数据下,我的代码,会将同一个钻石放在两个架子上~~所以测试数据答案为473,而我的答案为481,偏大了~

呜呜呜 是不是要想想完全,再开始写代码吗?比如要想到怎么放置两种大小的钻石~

修修改后:想不到。只能通过积累~

arr_lr记录的是以这个数组为结尾,往前到开头,一个架子最多放几个钻石

arr_rl记录的是以这个数组为开头,往前到结尾,一个架子最多放几个钻石

问题二:for的停止循环条件写错了~~离谱答案50010 正确答案为5   好像是30/100

修改后:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值