美文网首页
每天一道算法题15

每天一道算法题15

作者: 雨打空城 | 来源:发表于2022-01-24 16:41 被阅读0次

    给定一个有序数组arr,给定一个正数aim,
    1)返回累加和为aim,所有不同二元组
    2)返回累加和为aim,所有不同三元组

    解答1: 因为arr是一个有序数组,所以这里可以用双指针,分别指向头尾L,R,如果arr[L]+arr[R] > aim,则R--
    如果arr[L]+arr[R] < aim,则L++,如果arr[L]+arr[R]=aim, 如果arr[L] != arr[L-1], 则可以算一个二元组,并且L++;

    public static void printUniquePair(int arr[], int aim) {
        if (arr == null || arr.length < 2) {
            return;
        }
    
        int left = 0; 
        int right = arr.length - 1;
        while(left < right) {
            if (arr[left] + arr[right] > aim) {
                right --;
            } else if (arr[left] + arr[right] < aim) {
                right++
            } else {
                if (left == 0 || arr[left - 1] != arr[left]) {
                    System.out.println(arr[left] + " " + arr[right]);
                }
                left++;
                right--;
            }
        }
    }
    

    解答2: 这个三元组可以认为每次固定一个值,然后在剩下的范围内找到累加和为aim-arr[i]的不同二元组,这里要注意,如果是重复的,就可以跳过,
    因为重复的剩下的范围前面一个已经包含进去了。

    public static void printUniqueTriad(int[] arr, int aim) {
        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+1, arr.length - 1, aim-arr[i]);
            }
        }
    }
    
    public static void printRest(int[] arr, int left, int right, int aim) {
        while(left < right) {
            if (arr[left] + arr[right] > aim) {
                right --;
            } else if (arr[left] + arr[right] < aim) {
                right++
            } else {
                if (arr[left - 1] != arr[left]) {
                    System.out.println(arr[left] + " " + arr[right]);
                }
                left++;
                right--;
            }
        }
    }

    相关文章

      网友评论

          本文标题:每天一道算法题15

          本文链接:https://www.haomeiwen.com/subject/cqgmhrtx.html