题目描述
给定排序数组arr和整数k,不重复打印arr中所有相加和为k的严格升序的三元组
例如, arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9], k = 10,打印结果为:
-4 5 9
-3 4 9
-3 5 8
0 1 9
0 2 8
1 4 5
[要求]
时间复杂度为O(n^2)O(n
2
),空间复杂度为O(1)O(1)
输入描述:
第一行有两个整数n, k
接下来一行有n个整数表示数组内的元素
输出描述:
输出若干行,每行三个整数表示答案
按三元组从小到大的顺序输出(三元组大小比较方式为每个依次比较三元组内每个数)
示例1
输入
复制
10 10
-8 -4 -3 0 1 2 4 5 8 9
输出
复制
-4 5 9
-3 4 9
-3 5 8
0 1 9
0 2 8
1 4 5
#include<iostream>
#include<stdio.h>
#include<vector>
#include<climits>
using namespace std;
//三指针解法,
int arr[1007];
int main()
{
int n,res;
scanf("%d%d",&n,&res);
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
for(int i=0;i<n;i++)
{
if( arr[i]!=0 && arr[i]==arr[i-1] )//保证这次出现的值与上次不同
continue;
int l=i+1,r=n-1,ans=res-arr[i];
while( l<r )
{
if( arr[l]+arr[r]==ans )
{
if(arr[l]!=arr[l-1]) //防止重复
printf("%d %d %d\n",arr[i],arr[l],arr[r]);
l++,r--;
}
else if( arr[l]+arr[r]<ans )
l++;
else
r--;
}
}
return 0;
}