描述
给定排序数组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个整数表示数组内的元素
接下来一行有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--; } } } }