0 引言

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

1 抽象问题具体化

举例: 序列为{1,2,3,4,5,6,7,8,9}, 和为10

解答:如下图所示,一头一尾两个指针分别运动,找到和为10的两个数,并比较其乘积,得到乘积最小的两个数作为结果输出。

  1*9 = 9;

  2*8 = 16;

  3*7 = 21;

  4*6 = 24;

  

2 具体问题抽象分析

算法描述:设序列为array,和为sum

(1)将两个指针初始化为序列头(p)尾(q)两项;

(2)如果两个数的和小于sum(array[p] + array[q] < sum),则考虑增大p,使得和值增大;

(3)如果两个数的和大于sum(array[p] + array[q] > sum),则考虑减小q,使得和值减小;

(4)如果两个数的和等于sum(array[p] + array[q] == sum),则考虑增大p或者减小q,使得遍历继续,同时根据两数的乘积更新最小乘积以及输出值;

(5)返回结果

3 demo

/* 寻找递增序列中和为sum的两个数
* 输入1: vector<int> array,递增序列
* 输入2: int sum, 和
* 输出: vector<int>格式,两个数,其和等于sum,乘积最小
* 算法思路描述:一头一尾两个指针分别运动,记录其和值中乘积最小的一个
*/
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> twoNums{,};
if(array.size() < ){
twoNums.clear();
return twoNums;
}
int minMultiplication = pow(array[array.size()-],);
for(int p=, q=(int)array.size()-; p != q;){
if(array[p] + array[q] < sum)
++ p;
else if(array[p] + array[q] > sum)
-- q;
else{
if(array[p] * array[q] <= minMultiplication){
minMultiplication = array[p] * array[q];
twoNums[] = array[p];
twoNums[] = array[q];
}
-- q; // 或者++ p;
}
}
if(twoNums[] == && twoNums[] == )
twoNums.clear();
return twoNums;
}

4 代码优化

27 和为S的两个数字的更多相关文章

  1. 【面试题041】和为s的两个数字VS和为s的连续正数序列

    [面试题041]和为s的两个数字VS和为s的连续正数序列 题目一:     输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. ...

  2. 10.排序数组中和为给定值的两个数字[Find2NumbersWithGivenSum]

    [题目] 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1 ...

  3. JavaScript求两个数字之间所有数字的和

    这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...

  4. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  5. [LeetCode] Add Two Numbers 两个数字相加

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  6. 求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法

    今天面试,遇到面试官询求最大公约数.小学就学过的奥数题,居然忘了!只好回答分解质因数再求解! 回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:ht ...

  7. [CareerCup] 2.5 Add Two Numbers 两个数字相加

    2.5 You have two numbers represented by a linked list, where each node contains a single digit. The ...

  8. java integer对象判断两个数字是否相等

    java integer对象判断两个数字是否相等,不一定对 问题发生的背景:javaweb的项目,起先,因为在java中实体类中的int类型在对象初始化之后会给int类型的数据默认赋值为0,这样在很多 ...

  9. 和为S的两个数字

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

随机推荐

  1. cboard进行访问,汉化

  2. Yii2-rbac

    下面介绍一个 yii2.0 的 Rbac 权限设置,闲话少说,直接上代码,   1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者ma ...

  3. Shiro学习(11)缓存机制

    Shiro提供了类似于spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现.对于Cache的一些概念可以参考我的<Spr ...

  4. Java中链接MS SQL 数据库用法详解

    一.第一种方法: 使用JDBC-ODBC的桥方式 JDBC-ODBC桥连接器是用JdbcOdbc.class 和一个用于访问ODBC驱动程序的本地库实现的,对于Windows平台,该本地库是一个动态链 ...

  5. python实现语音录入识别

    一.介绍 1.第一步录音存入本地 2.调用百度语音识别sdk 注意点:百度语音识别对声音源有要求,比特率必须是256kbps 二.代码 #安装必要库 pip install baidu-aip #百度 ...

  6. mongdb 备份还原导入导出

    -------------------MongoDB数据导入与导出------------------- 1.导出工具:mongoexport     1.概念:         mongoDB中的m ...

  7. POJ 2451 Uyuw's Concert (半平面交)

    题目链接:POJ 2451 Problem Description Prince Remmarguts solved the CHESS puzzle successfully. As an awar ...

  8. PAT_A1075#PAT Judge

    Source: PAT A1075 PAT Judge (25 分) Description: The ranklist of PAT is generated from the status lis ...

  9. LeetCode刷题笔记-DP算法-取数问题

    题目描述 (除数博弈论)爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < ...

  10. Hyperledger:名词解释

    架构概念: VSCC (Validation System Chaincode) Auditability(审计性):在一定权限和许可下,可以对链上的交易进行审计和检查. Block(区块):代表一批 ...