1:题目描述
题目描述
给定排序数组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个整数表示数组内的元素
输出描述:
输出若干行,每行两个整数表示答案按二元组从小到大的顺序输出(二元组大小比较方式为每个依次比较二元组内每个数)
2:题目分析
这是一道双指针的问题,我们可以分析知道从左右指针开始寻找合适的数组元素即可,只要找到了,就输出,同时将左右指针分别加一和减一。即可
3:代码示例
package No3;
import java.util.Scanner;
/**
* @author :dazhu
* @date :Created in 2020/3/29 13:46
* @description:
* @modified By:
* @version: $
*/
public class Main {
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] array = new int[n];
for(int i=0;i<n;i++){
array[i] = sc.nextInt();
}
int left = 0;
int right = n-1;
// for(left=0;left<n;left++){
// if(left>=right){
// break;
// }
// //如果此时左右之和大,则继续right-1,向左继续寻找
// while(array[left]+array[right]>k){
// right--;
// }
// if(array[left]+array[right]==k&&left!=right){
//// System.out.print(array[left]+" "+array[left]);
//// System.out.println();
// System.out.println(array[left]+" "+array[right]);
//
// }
// }
int sum = 0;
StringBuffer sb = new StringBuffer();
while(true){
if(left>=right){
break;
}
sum = array[left]+array[right];
if(sum>k){
right--;
}
else{
if(sum<k){
left++;
}
//等于的情况
else{
sb.append(array[left]).append(" ").append(array[right]).append("\n");
left++;
right--;
}
}
}
System.out.print(sb.toString());
}
}
来源:https://www.cnblogs.com/dazhu123/p/12592267.html