• 算法03不重复打印排序数组中相加和为给定值的所有二元组


    描述

    给定排序数组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

    思路:

     由于是已经排序好的数组,因此可以使用双指针法来保证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--;
                }
            }
        }
    }
  • 相关阅读:
    Linux_服务器_09_新虚拟机下linux网络配置
    计算机_软件技巧_01_优雅地再word中插入代码
    Tomcat_总结_01_tomcat环境搭建
    gradle_学习_01_gradle安装与基本使用
    Git_学习_01_ git 安装与配置
    redis_学习_02_redis 可视化工具 Redis Desktop Manager
    redis_学习_01_redis的安装
    Idea_学习_08_常用快捷键
    Git_学习_07_ 推送修改到远端
    20180403_调bug_大地保险_jar包冲突
  • 原文地址:https://www.cnblogs.com/sfnz/p/15781934.html
Copyright © 2020-2023  润新知