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

描述

给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组
例如, arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9], k = 10,打印结果为:
1, 9
2, 8
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
 

输入描述:

第一行有两个整数n, k
接下来一行有n个整数表示数组内的元素

输出描述:

输出若干行,每行两个整数表示答案
按二元组从小到大的顺序输出(二元组大小比较方式为每个依次比较二元组内每个数)

示例1

输入:
10 10
-8 -4 -3 0 1 2 4 5 8 9

输出:
1 9
2 8

思路:

 由于是已经排序好的数组,因此可以使用双指针法来保证O(n)的时间复杂度,注意在移动指针的时候需要去重。

1).定义 i,j 让i在最左边,j在最右边开始比较;
2).当和大于k时 j--(排好序得数组);
3).当和小于k时i++;
4).当等于时输出i,j所对应得值;
5).所需要注意的时题目要求(输出的值布恩那个重复)因此进行判定i-1位置得值与i时相等时i继续向右移动,知道i==j时结束;
import java.util.Scanner;

public class Main{
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int[] arr = new int[n];
        
        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        //数组有序,两数和,双指针思想
        int i= 0;
        int j = n - 1;
        while(i<j){
            int sum = arr[i]+arr[j];
            if(sum<k){
                i++;
            } else if(sum>k){
                j--;
            } else {
                if(i==0||arr[i]!=arr[i-1]||j==n-1){
                    System.out.println(arr[i]+" "+ arr[j]);
                }
                i++;
                j--;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/sfnz/p/15781934.html