博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
和为S的两个数字
阅读量:4615 次
发布时间:2019-06-09

本文共 1075 字,大约阅读时间需要 3 分钟。

题目描述

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

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

方法一

最直观的一个方法就是现在数组中固定一个数字,再依次判断数组中其余的n-1个数字与它的和是不是等于S,复杂度是O(n2n^2n2)。

方法二

分析

我们选择数组中两个数字,如果其和等于S,那么说明我们找到了对的,如果小于S,我们希望两个数字的和在大一点,由于数组已经排好序了,所以选择较小数字后面的数字;同样,如果当两个数字的和大于输入数字的时候,我们可以选择较大数字前面的数字,因为排在数组前面的数字要小一些,所以可以采用左右夹逼法

注意:不要被条件输出两个数的乘积最小的误导。

假设:若b>a,且存在,
a + b = s;
(a - m ) + (b + m) = s
则:(a - m )(b + m)=ab - (b-a)m - m*m < ab;说明外层的乘积更小。

代码:

public ArrayList
FindNumbersWithSum(int [] array,int sum) {
ArrayList
list = new ArrayList
(); if(array == null || array.length <= 1) {
return list; } //设置两个指针分别指在数组头和数组尾 int low = 0, high = array.length - 1; while(high > low) {
//当第一次找到合适的数字时处于所有合适数字的最外层,通过上面的证明其乘积也是最小的 if(array[low] + array[high] == sum) {
list.add(0, array[low]); list.add(1, array[high]); break; } else if(array[low] + array[high] > sum) {
high--; } else {
low++; } } return list; }

转载于:https://www.cnblogs.com/lishanlei/p/10707671.html

你可能感兴趣的文章
并不对劲的hdu4777
查看>>
linux使用rz、sz快速上传、下载文件
查看>>
判断数字的正则表达式
查看>>
DOC常用命令(转)
查看>>
php写一个判断是否有cookie的脚本
查看>>
Mac配置Fiddler抓包工具
查看>>
转:Java并发集合
查看>>
Word截图PNG,并压缩图片大小
查看>>
Python项目对接CAS方案
查看>>
mysql产生随机数
查看>>
编程风格
查看>>
熟悉常用的Linux命令
查看>>
易之 - 我是个大师(2014年3月6日)
查看>>
Delphi中窗体的事件
查看>>
file_get_contents()获取https出现这个错误Unable to find the wrapper “https” – did
查看>>
linux vi编辑器
查看>>
js树形结构-----(BST)二叉树增删查
查看>>
contract
查看>>
FJUT ACM 1899 Largest Rectangle in a Histogram
查看>>
如何删除xcode项目中不再使用的图片资源
查看>>