【剑指Offer】42、和为S的两个数字
题目描述:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
解题思路:
对于本题,比上一题简单一些。看到题目,我们的第一感觉是暴力解法,即先在数组中固定一个数字,然后依次判断数组中其他数字与它的和是不是等于S。这显然复杂度为O(n^2)。
进一步分析,类似于上一题的思路,我们可以使用双指针解法。我们定义两个指针low和high,low从左向右遍历,high从右向左遍历,也就是low指向第一个元素,high指向最后一个元素。首先,比较low和high的和与给定的S,如果和小于S,那么就要增大输入值,即low向右移动一位;如果和大于S,那么就要减小输入值,即high向左移动一位;如果和等于S,那么这两个数字就是我们要找的数字。依次循环查找,直到low和high相等为止。
这个算法只需要最多一次扫描,复杂度为O(n),并且还有一个好处,就是这样找到的两个数满足乘积最小的条件。这可以这样证明:考虑x+y=C(C是常数),xy的大小。不妨设y>=x,y-x=d>=0,即y=x+d, 2x+d=C, x=(C-d)/2, xy=x(x+d)=(C-d)(C+d)/4=(C2-d2)/4,也就是xy是一个关于变量d的二次函数,对称轴是y轴,开口向下。d是>=0的,d越大, xy也就越小。
举例:
编程实现(Java):
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> res=new ArrayList<>();
int low=0,high=array.length-1;
while(low<high){
int curSum=array[low]+array[high];
if(curSum==sum){ //找到一个解
res.add(array[low]);
res.add(array[high]);
break;
}
else if(curSum<sum)
low++;
else
high--;
}
return res;
}
}
【剑指Offer】42、和为S的两个数字的更多相关文章
- 剑指Offer 42. 和为S的两个数字 (其他)
题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 题目 ...
- [剑指Offer] 42.和为S的两个数字
题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. [思 ...
- [剑指Offer]41.和为S的两个数字 VS 和为S的连续正数序列
[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of ...
- 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针
剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...
- 力扣 - 剑指 Offer 57. 和为s的两个数字
题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...
- 【剑指Offer】和为S的两个数字 解题报告(Python)
[剑指Offer]和为S的两个数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 《剑指offer》和为S的两个数字
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 【Java】 剑指offer(57-1) 和为s的两个数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它 ...
- Go语言实现:【剑指offer】和为S的两个数字
该题目来源于牛客网<剑指offer>专题. 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 对应每个测试案 ...
- 剑指offer系列45---和为s的两个数字
[题目]输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, package com.exe9.offer; /** * [题目]输入一个递增排序的数组和一个数字S,在数组中 ...
随机推荐
- Linux vim 入门 配置 及 使用初步
网上能够找到的,关于VI的教程,更是多为能吓死人的上百页说明.事实上, 从我个人的实践看,全然不须要如此夸张.要完毕最主要的编辑.仅仅要熟悉几个命令,就是把VIM用得非常好. 这里就列举一下: Esc ...
- IntelliJ IDEA 16 EAP新特性一览
IntelliJ IDEA 16 EAP新特性一览 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs IntelliJ I ...
- 小议:部署SharePoint 2013时,无法连接SQL Server问题
最近在给学员培训时发现,个别学员在完毕SharePoint 2013部署时,无法连接SQL Server,两种报错情况,例如以下所看到的: :配置SharePointConnect to SQL Se ...
- Linux局域网搭建
系统版本号:Linux red hat 6.3 1. 打开ifcfg-eth0 # cd /etc./sysconfig/network-scripts # vim ifcfg-eth0 2. 改动i ...
- double型转换成string型
double型转换成string型 题目描写叙述: 如有一个函数.其可接受一个long double參数,并将參数转换为字符串.结果字符串应保留两位小数,比如,浮点值123.45678应该生成&quo ...
- Modern Qt Development: The Top 10 Tools You Should Be Using
Published Friday October 12th, 2018Leave a comment Posted in Biz Circuit & Dev Loop, C++, QtCrea ...
- [AtCoder3954]Painting Machines
https://www.zybuluo.com/ysner/note/1230961 题面 有\(n\)个物品和\(n-1\)台机器,第\(i\)台机器会为第\(i\)和\(i+1\)个物品染色.设有 ...
- hdu3853LOOPS(概率与期望dp)
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total Sub ...
- bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛(状压dp)
1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1032 Solved: 588[ ...
- Django day07 (二)单表操作
单表操作 -mysql数据库:settings里配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME ...