码迷,mamicode.com
首页 > 其他好文 > 详细

【剑指Offer】42、和为S的两个数字

时间:2020-02-12 19:07:24      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:剑指offer   main   code   rgs   static   最小   描述   color   style   

题目描述

输入一个递增排序的数组和一个数字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     }

 

【剑指Offer】42、和为S的两个数字

标签:剑指offer   main   code   rgs   static   最小   描述   color   style   

原文地址:https://www.cnblogs.com/Blog-cpc/p/12299809.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!