一道算法题

Posted 韩思明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道算法题相关的知识,希望对你有一定的参考价值。

题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输入:

每个测试案例包括两行:
第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int
第二行包含n个整数,每个数组均为int类型。

输出:

对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”

样例输入:

6 15
1 2 4 7 11 15

样例输出:

4 11


package com.csdhsm.algorithm;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/** 
 * @Title: Test001.java
 * @Package: com.csdhsm.Algorithm
 * @Description 
 * @author Han
 * @date 2016-4-3 下午9:41:41 
 * @version V1.0
 */ 
      
/**************************************************************************************************** 
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 
输入:
每个测试案例包括两行:
第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int
第二行包含n个整数,每个数组均为int类型。
输出:
对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”
样例输入:
6 15
1 2 4 7 11 15
*****************************************************************************************************/  

public class Test001 {
    
    private static Scanner scanner = new Scanner(System.in);

     
    /** 
     * @Description 得到相加为k的两个数字
     * @author Han
     * @param list 输入的数组
     * @param n 数组个数
     * @param k  相加之和
     */
          
    private static List<Integer> getTheTwoNumber(List<Integer> list, int n, int k) {
        
        int low = 0;
        int high = n-1;
        
        if(n<2){
            
            System.out.println("数组个数小于2");
            
            return null;
        }
        
        List<Integer> result = new ArrayList<Integer>();
        
        //当low == high时,表示该数组内没有两个相加为k的数
        while(low < high){
            
            //结果成立,返回
            if((list.get(low) + list.get(high)) == k){
                
                result.add(list.get(low));
                result.add(list.get(high));
                
                return result;
            }
            
            //结果小于k,则表示需要更大的数字,则为low ++ ,相反则表示需要更小的数字,为high --
            if((list.get(low) + list.get(high))<k){
                
                low ++;
            }else{
                
                high --;
            }
        }
        
        result.add(-1);
        result.add(-1);
        return result;
    }
    
    public static void main(String[] args) {
        
        int n;//数组中的元素个数
        int k;//表示两数之和
        
        System.out.println("请输入数组的个数");
        
        //输入数组个数
        if(scanner.hasNextInt()){
            
            n = scanner.nextInt();
            if(n<=0){
                
                System.out.println("数组个数必须大于0");
                return;
            }
        }else{
            
            System.out.println("请输入一个整数");
            return;
        }
        
        System.out.println("请输入两数之和");
        
        //输入两数之和
        if(scanner.hasNextInt()){
            
            k = scanner.nextInt();
        }else{
            
            System.out.println("请输入一个整数");
            return;
        }
        
        System.out.println("请输入" + n + "个升序数字");
        
        List<Integer> list = new ArrayList<Integer>();  
        
        //输入一个升序数组
        for(int i=0;i<n;i++){
            
            System.out.println("请输入第" + (i+1) + "个数字");
            if(scanner.hasNextInt()){
                
                int temp = scanner.nextInt();
                
                if(i!=0){
                    
                    //输入的不是一个升序数组
                    if(temp < list.get(i-1)){
                        
                        System.out.println("请输入升序数组");
                        i--;
                    }else{
                        
                        System.out.println("输入成功");
                        list.add(temp);
                    }
                }else{
                    
                    //第一次输入,不需要判断
                    System.out.println("输入成功");
                    list.add(temp);
                }
            }else{
                
                System.out.println("输入错误,请重新输入!");
                i--;
            }
        }
        
        List<Integer> _list = getTheTwoNumber(list,n,k);
        
        if(_list != null){

            System.out.println(_list);
        }
    }
}

 

以上是关于一道算法题的主要内容,如果未能解决你的问题,请参考以下文章

一道让你拍案叫绝的算法题

每日一道算法题04:重建二叉树

搜狗2019秋招的一道算法题:龟兔赛跑

复杂链表的复制(一道算法题)

每天一道算法题(java数据结构与算法)——>反转链表

每天一道算法题(java数据结构与算法)——> 链表的中间结点