您的位置:首页 > 其它

不重复打印排序数组中相加和为给定值的所有二元组和三元组

2018-03-06 16:27 375 查看


//不重复打印排序数组中相加和为给定值的所有二元组和三元组
public class GetArrNum{

//(1)获得排序数组中为给定值的二元组
public static void GetArrNum2(int []arr,int k)
{
if(arr==null||k<arr[0]||arr.length<2)
{
return;
}
//设置两个指针
int i=0;
int j=arr.length-1;
for(int w=0;w<arr.length;w++)
{
if((arr[i]+arr[j]==k)&&(i!=j))
{
System.out.println(arr[i]+" "+arr[j]);
j--;
}else if(arr[i]+arr[j]>k)
{
break;
}else{
i++;
}
}
System.out.println();
}

//(2)获得排序数组中为给定值的三元祖
public static void GetArrNum3(int[]arr,int k)
{
if(arr==null||k<arr[0]||arr.length<3)
{
return;
}
//设置两个指针
int i=0;
while(i!=arr.length-3)
{
for(int j=arr.length-1;j>=3;j--)
{
for(int w=i+1;w<arr.length-1;w++)
{
if(arr[i]+arr[j]+arr[w]==k&&((w<j))&&(i<j))
{
System.out.println(arr[i]+" "+arr[w]+" "+arr[j]);
}else if(arr[i]+arr[j]+arr[w]>k)
{
break;
}

}

}
i++;
}
System.out.println();
}

//(2)获得排序数组中为给定值的三元祖 方法二O(N*N)
public static void GetArrNum3T(int[] arr, int k) {
if (arr == null || arr.length < 3) {
return;
}
for (int i = 0; i < arr.length - 2; i++) {
if (i == 0 || arr[i] != arr[i - 1]) {
printRest(arr, i, i + 1, arr.length - 1, k - arr[i]);
}
}
}

public static void printRest(int[] arr, int f, int l, int r, int k) {
while (l < r) {
if (arr[l] + arr[r] < k) {
l++;
} else if (arr[l] + arr[r] > k) {
r--;
} else {
if (l == f + 1 || arr[l - 1] != arr[l]) {
System.out.println(arr[f] + "," + arr[l] + "," + arr[r]);
}
l++;
r--;
}
}
}

public static void main(String[]args)
{
int[]arr={-8,-4,-3,0,1,2,4,5,8,9};
int k=10;
GetArrNum2(arr,k);
GetArrNum3(arr,k);
GetArrNum3T(arr,k);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐