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

  • Post author:
  • Post category:其他



【题目】

给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组。

例如:

arr=[-8,-4,-3,0,1,2,3,4,5,8,9],k=10

打印结果为:

1,9

2,8


【补充题目】


给定排序数组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


【代码】

    public static void main(String[] args) {
        int[] arr=new int[]{-8,-4,-3,0,1,2,4,5,8,9};
        printUniquePair(arr,10);//1,9;2,8
        printUniqueTriad(arr,10);
    } 

    //不重复打印排序数组中相加和为给定值的所有二元组
    public static void printUniquePair(int[] arr,int k){
        if(arr==null||arr.length<2){
            return;
        }
        int left=0;
        int right=arr.length-1;
        //因为是排序数组,利用左指针和右指针不断向中间压缩
        while(left<right){
            if(arr[left]+arr[right]<k){
                left++;
            }else if(arr[left]+arr[right]>k){
                right--;
            }else{
                if(left==0||arr[left-1]!=arr[left]){
                    //保证不重复打印:检查arr[left]是否和arr[left-1]相等
                    System.out.println(arr[left]+","+arr[right]);
                }
                left++;
                right--;
            }
        }
    }

    //不重复打印排序数组中相加和为给定值的所有三元组
    public static void printUniqueTriad(int[] arr,int k){
        if(arr==null||arr.length<3){
            return;
        }
        //先定三元组的第1个元素,接下来找和为k-arr[i]的二元组
        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]);
            }
        }       
    }

    private static void printRest(int[] arr, int first, int left, int right, int k) {
        while(left<right){
            if(arr[left]+arr[right]<k){
                left++;
            }else if(arr[left]+arr[right]>k){
                right--;
            }else{
                if(left==first+1 || arr[left-1]!=arr[left]){
                    //保证二元组不重复
                    System.out.println(arr[first]+","+arr[left]+","+arr[right]);
                }
                left++;
                right--;
            }
        }
    }



版权声明:本文为junjunba2689原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。