双指针应用场景
双指针技术常用于处理有序数组或链表中的搜索与匹配问题,主要包括快慢指针和对撞指针两种模式。
C++ 双指针算法实战涵盖有效三角形个数与和为 S 的两个数字问题。前者通过排序后固定最大边并利用对撞指针统计满足两边之和大于第三边的组合数;后者利用有序数组特性,设置左右指针向中间移动查找目标和。两者均基于排序预处理加指针移动策略,有效降低时间复杂度。

双指针技术常用于处理有序数组或链表中的搜索与匹配问题,主要包括快慢指针和对撞指针两种模式。
给定一个包含非负整数的数组 nums,返回其中可以组成三角形三元组的个数。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
int ret = 0;
for (int i = n - 1; i >= 2; i--) {
int left = 0, right = i - 1;
while (left < right) {
if (nums[left] + nums[right] > nums[i]) {
ret += right - left;
right--;
} else {
left++;
}
}
}
return ret;
}
};
int main() {
vector<int> nums1 = {4, 2, 3, 4};
cout << Solution().triangleNumber(nums1) << endl;
return 0;
}
在一个递增排序的数组中找出两个数,使它们的和等于给定的目标值 target。
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& price, int target) {
int left = 0;
int right = price.size() - 1;
while (left < right) {
if (price[left] + price[right] > target) {
right--;
} else if (price[left] + price[right] < target) {
left++;
} else {
return {price[left], price[right]};
}
}
return {-1, -1};
}
};
int main() {
vector<int> nums1 = {3, 9, 12, 15};
vector<int> result = Solution().twoSum(nums1, 18);
cout << "[";
for (int i = 0; i < result.size(); i++) {
cout << result[i];
if (i < result.size() - 1) cout << ",";
}
cout << "]" << endl;
return 0;
}
掌握双指针基础模型后,可进一步应用于三数之和、四数之和等进阶问题。核心思想在于排序预处理配合指针的智能移动,体现分治思想。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online