【题目】给定排序数组arr和整数K,不重复打印arr中所有相加和为K的不降序二元组
【举例】arr = [1,2,3,4,5,7,8,9];K = 10;返回
1,9
2,8
3,7
【拓展】返回arr中所有相加和为K的不降序三元组
【举例】arr = [1,2,3,4,5,7,8,9];K = 10;返回
1,2,7
2,3,5
【二元组解题思路】利用左右指针往中间压缩
注意题目中的几个词:排序数组、不重复、二元组
(1)设置变量left = 0,right = len - 1;
(2)记sum = arr[left] + arr[right];即左右两个数之和,把它与K进行比较
- 如果sum == K ,打印arr[left] 和 arr[right]
- 如果sum > K,则right–;
- 如果sum < K,则left++;
(3)若left < right则一直重复步骤2,否则结束
如何保证不重复?只需要在打印时增加一个检查,判断arr[left]是否与arr[left-1]相等,相等则不打印。因为整体过程说从两边往中间压缩,如若有arr[left]+arr[right] == K,又有 arr[left]==arr[left-1],那么之前一定打印过这个二元组,则无需打印。
【C++code】
void printUniquePair(int arr[],int len, int K){
if(arr == NULL || len < 2){
return;
}
int left = 0;
int right = len-1;
while(left < right){
int sum = arr[left] + arr[right];
if(sum < K){
left++;
}else if(sum > K){
right--;
}else{
if(left == 0 || arr[left] != arr[left-