剑指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的连续正数序列