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