双指针算法(Two Pointers)是一种常用的算法技巧,用于解决数组或链表中的问题。其主要思想是使用两个指针(或索引)来遍历数组或链表,通常一个指针从头开始,另一个指针从尾开始,或者一个指针快一些,另一个指针慢一些。
双指针算法的优点是可以减少遍历次数,提高算法的效率。下面是双指针算法的基本步骤:
- 初始化两个指针(或索引),通常一个指针指向数组或链表的头部,另一个指针指向尾部。
- 根据问题的要求,确定指针的移动规则,例如一个指针向前移动,另一个指针向后移动,或者一个指针快一些,另一个指针慢一些。
- 在遍历过程中,比较两个指针指向的元素,根据比较结果,决定下一步的操作。
- 重复步骤 2 和 3,直到达到终止条件。
下面是一些常见的双指针算法的应用:
1、排序数组中查找目标元素
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
2、合并两个排序数组
vector<int> merge(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
int i = 0, j = 0;
while (i < nums1.size() && j < nums2.size()) {
if (nums1[i] < nums2[j]) {
result.push_back(nums1[i]);
i++;
} else {
result.push_back(nums2[j]);
j++;
}
}
while (i < nums1.size()) result.push_back(nums1[i++]);
while (j < nums2.size()) result.push_back(nums2[j++]);
return result;
}
3、在排序数组中查找第一个大于等于目标元素的索引
int findFirstGreaterEqual(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] >= target) {
if (mid == 0 || nums[mid - 1] < target) return mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
4、在数组中定某一元素,在另外一个数组中找到第一个大于或小于它的数
力扣455 分发饼干
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int index = s.size() - 1; // 饼干数组的下标
int result = 0;
for (int i = g.size() - 1; i >= 0; i--) { // 遍历胃口
if (index >= 0 && s[index] >= g[i]) { // 遍历饼干
result++;
index--;
}
}
return result;
}
};
这些例子都使用了双指针算法来解决问题,提高了算法的效率。