27 和为S的两个数字
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的两个数字的更多相关文章
- 【面试题041】和为s的两个数字VS和为s的连续正数序列
[面试题041]和为s的两个数字VS和为s的连续正数序列 题目一: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. ...
- 10.排序数组中和为给定值的两个数字[Find2NumbersWithGivenSum]
[题目] 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1 ...
- JavaScript求两个数字之间所有数字的和
这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...
- [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 ...
- [LeetCode] Add Two Numbers 两个数字相加
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- 求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法
今天面试,遇到面试官询求最大公约数.小学就学过的奥数题,居然忘了!只好回答分解质因数再求解! 回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:ht ...
- [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 ...
- java integer对象判断两个数字是否相等
java integer对象判断两个数字是否相等,不一定对 问题发生的背景:javaweb的项目,起先,因为在java中实体类中的int类型在对象初始化之后会给int类型的数据默认赋值为0,这样在很多 ...
- 和为S的两个数字
/* * 和为S的两个数字 * 题目描述 * 输入一个递增排序的数组和一个数字S,在数组中查找两个数 * 使得他们的和正好是S,如果有多对数字的和等于S,输出两个 * 数的乘积最小的. * ...
随机推荐
- vuex之module的使用
一.module的作用 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿. 为了解决以上问题,Vuex 允许我们将 store 分 ...
- Android 如何使edittext默认失去焦点
1.在布局文件中给edittext的父控件增加两个属性 android:focusable="true" android:focusableInTouchMode="tr ...
- PHP 的 new static 和 new self
下面我们举个例子: class Father { public static function getSelf() { return new self(); } public static funct ...
- KeepLived + nginx 高可用
. 环境准备 1. VMware; 2. 4台CentOs7虚拟主机:192.168.122.217, 192.168.122.165 3. 系统服务:LVS, Keepalived 4. Web服务 ...
- 【Flutter学习】基本组件之基本网格Gradview组件
一,概述 数据量很大的时用矩阵方式排列比较清晰,此时用网格列表组件,即为GridView组件,可实现多行多列的应用场景. 使用GridView创建网格列表有多种方式: GridView.count 通 ...
- Minimum Snap轨迹规划详解(1)轨迹规划
一. 轨迹规划是什么? 在机器人导航过程中,如何控制机器人从A点移动到B点,通常称之为运动规划.运动规划一般又分为两步: 1.路径规划:在地图(栅格地图.四\八叉树.RRT地图等)中搜索一条从A点到B ...
- HDU - 1712 (分组背包模板)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1712 题意:给你n个课程,每个课程有很多种学习方法,用的时间和取得的效果都不一样,现在你只有m天时间用来学 ...
- NX二次开发-Block UI C++界面(表达式)控件的获取(持续补充)
Expression(表达式)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); // ...
- XSS漏洞的渗透利用另类玩法
XSS漏洞的渗透利用另类玩法 2017-08-08 18:20程序设计/微软/手机 作者:色豹 i春秋社区 今天就来讲一下大家都熟悉的 xss漏洞的渗透利用.相信大家对xss已经很熟悉了,但是很多安全 ...
- 正则表达式Pattern类的基本用法
public void mailRegex() { // 要验证的字符串 String str = "shiruo.hdp@taobao.com"; // 邮箱验证规则 Strin ...