目录
双指针算法
左右两指针同时移动
前提条件:按升序(降序)排序
两数之和
#include <iostream>
#include <string>
using namespace std;
int main () {
int target, n;
cin >> target >> n;
int num[n];
for (int i = 0; i < n; i++) {
cin >> num[i];
}
for (int i = 0, j = n - 1; i < j;) {
if (num[i] + num[j] < target) i++;
else if (num[i] + num[j] > target) j--;
else {
cout << i << ' ' << j;
break;
}
}
return 0;
}
三数之和![](https://i-blog.csdnimg.cn/blog_migrate/336d4283197eff220715801ad449a452.png)
在双指针外套一层循环
#include <iostream>
#include <string>
using namespace std;
int main () {
int target, n;
cin >> target >> n;
int num[n];
for (int i = 0; i < n; i++) {
cin >> num[i];
}
for (int k = 0; k < n; k++) {
int temp = target - num[k];
for (int i = k + 1, j = n - 1; i < j;) {
if (num[i] + num[j] < temp) i++;
else if (num[i] + num[j] > temp) j--;
else {
cout << num[k] << ' ' << num[i] << ' ' << num[j] <<endl;
i++; j--;
}
}
}
return 0;
}
四数之和![](https://i-blog.csdnimg.cn/blog_migrate/7ad042e37fb3116b0a170f6e21d033c4.png)
在双指针外套两层循环
#include <iostream>
#include <string>
using namespace std;
int main () {
int target, n;
cin >> target >> n;
int num[n];
for (int i = 0; i < n; i++) {
cin >> num[i];
}
for (int m = 0; m < n; m++) {
for (int k = m + 1; k < n; k++) {
int temp = target - num[m] - num[k];
for (int i = k + 1, j = n - 1; i < j;) {
if (num[i] + num[j] < temp) i++;
else if (num[i] + num[j] > temp) j--;
else {
cout << num[m] << ' ' << num[k] << ' ' << num[i] << ' ' << num[j] <<endl;
i++; j--;
}
}
}
}
return 0;
}