目录
双指针算法
左右两指针同时移动
前提条件:按升序(降序)排序
两数之和
#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;
}
三数之和
在双指针外套一层循环
#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;
}
四数之和
在双指针外套两层循环
#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;
}