剑指offer--算法题--01--和为定值的两个数

题目描述:
输入一个递增排序的数组和一个数字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 jzoffer;

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

public class FindNumbersWithSum {
	public FindNumbersWithSum (){}
	public static void main(String[] args) {
		ArrayList<Integer> list = null;
		Scanner sc=new Scanner(System.in);
		int line = 0;
		int sum = 0;
		int count = 0;
		String inputString = null;
		while(sc.hasNext()){
			++line;
			if(line == 1){
			count = sc.nextInt();
			sum   = sc.nextInt();
			}else{
				inputString=sc.nextLine().toString();
			}
		}
		 String [] stringArray= inputString.split(" "); 
		 int num[]=new int[stringArray.length];
		 for(int i=0;i<stringArray.length;i++){
			    num[i]=Integer.parseInt(stringArray[i]);
			   }
		 list =  new FindNumbersWithSum().FindNumbersWithSum(num,sum);
		 for (Integer a : list) {
			System.out.print((int)a+" ");
		}
	}
	
	public ArrayList<Integer> FindNumbersWithSum(int[] array,int sum){
		ArrayList<Integer> list = new ArrayList<>();
		if(array.length <2 || array == null){           //特殊情况的判断
			return list;
		}
		int len = array.length;
		int start = 0;                                   //头指针
		int end = len-1;                                 //尾指针
		while(start<end && start <len -1 && end>0){
			if(array[start] + array[end] == sum){
				list.add(array[start]);
				list.add(array[end]);
				return list;
			}
			if(array[start] + array[end] > sum){
				end--;
			}
			if(array[start] + array[end] < sum){
				start++;
			}
		}
		return list;
	}
}

猜你喜欢

转载自blog.csdn.net/lsm18829224913/article/details/80247863