面试题57-题目一:和为s的两个数字

/*

 * 面试题57-题目一:和为s的两个数字

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

 * 思路:定义两个指针,分别从前面和后面进行遍历。间隔越远乘积越小,所以是最先出现的两个数乘积最小

 * 首先在数组中选择两个数字,即两个指针,第一个指针指向数组的第一个数字;第二个指针指向数组的最后一个数字。

 * 计算这两个数之和,如果s等于这两个数,就是期待的结果;

 * 如果S大于两数之和,则第一个指针向后移动一位;

 * 如果s小于两数之和,则第二个指针前移一位

 */

 

import java.util.ArrayList;

 

public class No57FindNumbersWithSum {

 

    public static void main(String[] args) {

       No57FindNumbersWithSum n = new No57FindNumbersWithSum();

      

       int[] array = {1,2,4,7,11,15};

       int sum = 15;

       ArrayList<Integer> list = new ArrayList<Integer>();

       list = n.FindNumbersWithSum(array, sum);

       for (int i = 0; i < list.size(); i++) {

           System.out.println(list.get(i));

       }

    }

 

    public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {

       ArrayList<Integer> list = new ArrayList<Integer>();

      

       if (array == null || array.length == 0) {

           return list;

       }

       //定义两个指针,分别从前面和后面进行遍历。间隔越远乘积越小,所以是最先出现的两个数乘积最小

       int left = 0;

       int right = array.length - 1;

      

       while(left < right) {

           //计算这两个数之和,如果s等于这两个数,就是期待的结果

           int s = array[left] + array[right];

          

           if (s == sum) {

              list.add(array[left]);

              list.add(array[right]);

              return list;

           } else if (s > sum) {// 如果s小于两数之和,则第二个指针前移一位

              right--;

           } else {//如果S大于两数之和,则第一个指针向后移动一位

              left++;

           }

       }

      

       return list;

    }

 

}

猜你喜欢

转载自blog.csdn.net/juaner1993/article/details/82760794
今日推荐