解题步骤
读取输入:首先读取整数 n,然后读取 n个正整数并存储在一个数组或容器中。
排序数组:对数组进行排序,以便后续使用双指针法高效查找。
遍历数组:对于每个数 target,检查是否存在另外两个不同的数 a和 b,使得 a + b = target。
双指针查找:对于每个 target,使用双指针法在已排序的数组中查找是否存在 a和 b满足条件。
计数结果:统计满足条件的 target的数量。
数组操作:包括读取、存储和遍历数组。
排序算法:对数组进行排序,常用的是 std::sort。
双指针技巧:用于在有序数组中高效查找满足特定条件的元素对。
条件判断与计数:通过条件判断来统计满足要求的元素数量。
usingnamespacestd;
intmain{
intn;
cin>> n;
vector< int> nums(n);
for( inti = 0; i < n; ++i) {
cin>> nums[i];
}
// 对数组进行排序
sort(nums.begin, nums.end);
intcount = 0;
for( inti = 0; i < n; ++i) {
inttarget = nums[i];
intleft = 0, right = n - 1;
while(left < right) {
if(left == i) {
left++;
continue;
}
if(right == i) {
right--;
continue;
}
intsum = nums[left] + nums[right];
if(sum == target) {
count++;
break;
} elseif(sum < target) {
left++;
} else{
right--;
}
}
}
cout<< count << endl;
return0;
}
代码解析
读取输入:使用 cin读取整数 n和 n个正整数,并存储在 vector
排序数组:使用 std::sort对数组进行升序排序。
遍历数组:使用 for循环遍历每个数 target。
双指针查找:使用两个指针 left和 right,分别从数组两端向中间移动,查找是否存在 a和 b满足 a + b = target。
条件判断与计数:如果找到满足条件的 a和 b,则计数器 count加1,并跳出当前循环。
在双指针查找过程中,需要跳过与 target相同的索引位置,以确保 a和 b是不同的数。
使用 break语句跳出内层循环,避免重复计算。