数组元素之和

久未见 提交于 2020-03-29 15:02:24

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个整数表示数组内的元素

输出描述:

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

输入

复制
10 10
-8 -4 -3 0 1 2 4 5 8 9

输出

复制
1 9
2 8

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());
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!