题目描述
给定排序数组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、定义i,j。 i指向最左边,j指向最右边。
2、当和大于k时j--(数组有序)
3、和小于k时i++;
4、当和等于k时,打印二元组。同时i++,j--(注意打印的二元组不能重复。使用num[left] !=num[left]方法)
5、当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[] nums = new int[N];
for(int i = 0; i < N; i++){
nums[i] = sc.nextInt();
}
if(nums == null || nums.length == 0){
return;
}
//数组有序,两数和,双指针思想
int left = 0, right = N - 1;
while(left < right){
if(nums[left] + nums[right] > k){
right--;
}else if(nums[left] + nums[right] < k){
left++;
}else{
//题目要求不能重复打印,重复时直接移动双指针
if(left == 0 || nums[left - 1] != nums[left]){
System.out.println(nums[left] + " " + nums[right]);
}
left++;
right--;
}
}
}
}