剑指Offer42和为S的两个数字

Posted blog-cpc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer42和为S的两个数字相关的知识,希望对你有一定的参考价值。

题目描述

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

输出描述:

对应每个测试案例,输出两个数,小的先输出。

题解:夹逼法
 1  /*假设:若b>a,且存在,
 2 a + b = s;
 3 (a - m ) + (b + m) = s
 4 则:(a - m )(b + m)=ab - (b-a)m - m*m < ab;说明外层的乘积更小*/
 5 //mine
 6 public static  ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
 7         ArrayList<Integer> list = new ArrayList<>();
 8          if (array == null || array.length == 0)
 9             return list;
10         for (int i = 0; i <array.length-1; i++) {
11             for (int j = array.length-1; j >=i; j--) {
12                 if (array[j] == (sum - array[i])) {
13                     list.add(array[i]);
14                     list.add(array[j]);
15                     return list;
16                 }
17             }
18         }
19         return list;
20     }
21 //讨论题解
22     public static ArrayList<Integer> FindNumbersWithSum02(int[] array, int sum) {
23         ArrayList<Integer> list = new ArrayList<>();
24         if (array == null || array.length == 0)
25             return list;
26         int left = 0;
27         int right = array.length - 1;
28         while (left < right) {
29             int total = array[left] + array[right];
30             if (total == sum) {
31                 list.add(array[left]);
32                 list.add(array[right]);
33                 return list;
34             } else if (total > sum) {
35                 //大于sum,说明太大了,right左移寻找更小的数
36                 --right;
37 
38             } else {
39                 //2.如果和小于sum,说明太小了,left右移寻找更大的数
40                 ++left;
41             }
42         }
43         return list;
44     }

测试:

1  public static void main(String[] args) {
2         ArrayList<Integer> arrayList = new ArrayList<Integer>();
3         int[] array = {0,1, 4, 6, 9,10, 15, 20, 22, 23};
4         int sum = 10;
5         arrayList = FindNumbersWithSum(array, sum);
6         //arrayList = FindNumbersWithSum02(array, sum);
7         System.out.println(arrayList);
8     }

 

以上是关于剑指Offer42和为S的两个数字的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer——57.和为s的两个数字,58.翻转单词顺序》代码

[剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列

剑指offer 和为s的两个数字

剑指OFFER 和为S的两个数字

剑指offer-和为s的俩个数字