剑指offer系列之四十一:和为S的两个数字且乘积最小
2015-12-13 13:47
295 查看
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
有了上一题的基础,解决这题应该不难,思路与上一题差不多,不过这里只需要要求两个数字即可。所以可以设定两个指针,第一个指针指向数组的第一个元素,第二个指针指向最后一个元素,不断改变第一个指针的位置就可以确定和为S的两个数字。这里还有一个要求是这两个数字的乘积最小,实际上由于数组是递增排序的,所以第一个找到的两个数字就是乘积最小的两个数字,相反如果要求是乘积最大的呢?当然是中间位置找到的那两个数字了。这是数学上的知识了,不再赘述。所以虽然有了乘积最小的要求,实际上是形同虚设的,这里实现的代码如下(已被牛客AC):
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
有了上一题的基础,解决这题应该不难,思路与上一题差不多,不过这里只需要要求两个数字即可。所以可以设定两个指针,第一个指针指向数组的第一个元素,第二个指针指向最后一个元素,不断改变第一个指针的位置就可以确定和为S的两个数字。这里还有一个要求是这两个数字的乘积最小,实际上由于数组是递增排序的,所以第一个找到的两个数字就是乘积最小的两个数字,相反如果要求是乘积最大的呢?当然是中间位置找到的那两个数字了。这是数学上的知识了,不再赘述。所以虽然有了乘积最小的要求,实际上是形同虚设的,这里实现的代码如下(已被牛客AC):
package com.rhwayfun.offer; import java.util.ArrayList; public class FindTwoNumberSum { public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) { ArrayList<Integer> list = new ArrayList<Integer>(); if(array == null || array.length < 1) return list; int low = 0; int high = array.length - 1; while(low < high){ int curSum = array[low] + array[high]; if(curSum == sum){ //由于数组是递增排序的,所以第一个找到的数对肯定是乘积最小的。 //比如,1+4=2+3,如果从第一个位置开始找的话,显然1与4的乘积是最小的 list.add(array[low]); list.add(array[high]); break; }else if(curSum > sum){ high--; }else{ low++; } } return list; } public static void main(String[] args) { int[] array = new int[]{1,2,7,8,13,15}; ArrayList<Integer> list = new FindTwoNumberSum().FindNumbersWithSum(array, 15); System.out.println(list); } }
相关文章推荐
- js 对表格的动态操作(动态添加行,删除该行,在指定位置添加控件)
- js在不刷新的情况下动态添加表格行
- 剑指offer系列之四十:和为S的连续正数序列
- AlloyTeam2015前端大会都说了啥
- 剑指offer系列之三十九:数组中只出现一次的数字
- 剑指offer系列之三十八:判断是否是平衡二叉树
- bootstrap封装成seajs cmd模块
- 用jQuery在IFRAME里取得父窗口的某个元素的值
- Bootstrap HTML 5 文档类型
- node.js require() 源码解读
- 2015-12-12复习之OO CSS
- JavaScript 模块的循环加载实现方法
- Javascript实用方法二
- js数据类型检测方法(总结)
- javascript返回上一级(页)的方式
- JavaScript:验证input[type=‘text’]输入框动态数据
- Web前端技能
- CSS之box-shadow
- AngularJs实战(五)
- json中的值类型及输出对象的所有名称和对应的值