不重复打印排序数组中相加和为给定值的所有二元组和三元组
给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组。
例如,arr=[-8,-4,-3,0,1,2,4,5,8,9],k=10,打印结果为:
1,9
2,8
1.利用双指针法,设置遍历left=0和right=length-1
2.比较arr[left]+arr[right]的值(sum)与k的大小
如果sum等于k,打印arr[left],arr[right], left++,right–.
如果sum大于k,right–
如果sum小于k,left++
3.如果left< right,则一直重复步骤2,否则过程结束
为了保证不重复打印,只需在打印前增加一个检查:arr[left]是否与它前一个值相等,如果相等就不打印
解释:因为整体过程是两头向中间压缩的过程,如果arr[left]+arr[right]=k,又有arr[left]==arr[left-1],那么之前一定打印过这个二元组,则不用再重复打印
时间复杂度O(N)
1 | public void printUniquePair(int[] arr, int k){ |
三元组的问题类似于二元组的求解过程
例如 arr=[-8,-4,-3,0,1,2,4,5,8,9] k=10
当三元组的第一个值为-8时,寻找-8后面的子数组中所有相加为18的不重复二元组
当三元组的第一个值为-4时,寻找-4后面的子数组中所有相加为14的不重复二元组
当三元组的第一个值为-3时,寻找-3后面的子数组中所有相加为13的不重复二元组
依次类推:
如果不重复打印?首先保证每次寻找过程开始前,选定的三元组中第一个值不重复,其次就是原问题的打印检查一样,保证不重复打印二元组
时间复杂度为O(n^2)
1 | public void printUniqueTriad(int[] arr, int k){ |