双指针

1.双指针(普通指针,对撞指针,快慢指针)

思路:首先想暴力做法,对暴力做法做优化

2.acwing 1532 找硬币 对撞指针

伊娃喜欢从整个宇宙中收集硬币。

有一天,她去了一家宇宙购物中心购物,结账时可以使用各种硬币付款。

但是,有一个特殊的付款要求:每张帐单,她只能使用恰好两个硬币来准确的支付消费金额。

给定她拥有的所有硬币的面额,请你帮她确定对于给定的金额,她是否可以找到两个硬币来支付。

输入格式

第一行包含两个整数 N 和 M,分别表示硬币数量以及需要支付的金额。

第二行包含 N 个整数,表示每个硬币的面额。

输出格式

输出一行,包含两个整数 V1,V2,表示所选的两个硬币的面额,使得 V1≤V2V1≤V2 并且 V1+V2=M。

如果答案不唯一,则输出 V1 最小的解。

如果无解,则输出 No Solution

数据范围

1≤N≤105,
1≤M≤1000

输入样例1:

8 15
1 2 8 7 2 4 11 15

输出样例1:

4 11

代码1: 

#include
#include
using namespace std;
const int N=1e5+5;
int n,m;
int a[N]; 

int main(){
	cin>>n>>m;
	for(int i=0;i>a[i];
	}
	sort(a,a+n);
	int i=0,j=n-1; //双指针思想
	while(im) j--; 
	}
	
	if(i

代码2:

#include
#include
using namespace std;
const int N=1e5+5;
int n,x;
int a[N];

int main(){
	cin>>n>>x;
	for(int i=0;i>a[i];
	}
	sort(a,a+n);
	for(int i=0,j=n-1;a[i]+a[j]x) j--;
		if(a[i]+a[j]==x) {
			cout<

题目推荐:acwing 800 数组元素的目标和  

                  acwing  799 最长连续不重复子序列

                  快速排序


 

3.acwing  34  链表中环的入口结点  快慢指针

给定一个链表,若其中包含环,则输出环的入口节点。

若其中不包含环,则输出null

数据范围

节点 val 值取值范围 [1,1000][1,1000]。
节点 val 值各不相同。
链表长度 [0,500][0,500]。

样例

双指针_第1张图片

给定如上所示的链表:
[1, 2, 3, 4, 5, 6]
2
注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。

则输出环的入口节点3.

代码: 

class Solution { 

public:

    ListNode *entryNodeOfLoop(ListNode *head) {

        auto i = head, j = head;

        while (i && j) {

            i = i->next;

            j = j->next;

            if (j) j = j->next;

            else break;

            if (i == j) {

                i = head;

                while (i != j) {

                    i = i->next;

                    j = j->next;

                }

                return i;

            }

        }

        return 0;

    }

}; 

你可能感兴趣的:(算法基础,算法,leetcode,职场和发展)