【剑指offer学习】求和为定值的两个数
来源:互联网 发布:矩阵的秩是什么意思 编辑:程序博客网 时间:2024/05/18 08:44
- 《神雕侠侣》中的‘剑冢’,收存着‘剑魔独孤求败’生平用过的三把剑:“杨过提起右首第一柄剑,只见剑下的石上刻有两行小字‘凌厉刚猛,无坚不摧,弱冠前以之与河朔群雄争锋’;第二把是玄铁重剑:‘重剑无锋,大巧不工。四十岁前恃之横行天下’;第三把则是木剑,剑下的石刻道:‘四十岁后,不滞于物,草木竹石均可为剑。自此精修,渐进于无剑胜有剑之境。’。算法的精髓也在于此,只有突破一层层境界,才能有所突破。
题目描述:
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 输入:
- 每个测试案例包括两行:第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int第二行包含n个整数,每个数组均为int类型。
- 输出:
- 对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”
- 样例输入:
6 151 2 4 7 11 15
- 样例输出:
4 11
思路:这一道题目很简单, 其中最直接的做法是暴力破解法,用两个for循环,时间复杂度为O(n*n),但是这样没有充分利用升序数组这一前提,并且效率极低。
可以用类似于二分查找的方法来求,假设数组为A,长度为len,给定的和为sum,最好的方法是先用数组的第一个数A[low]和最后一个数A[high]相加,看是否等于sum,如果等于sum,则找到了一组数,返回true,如果大于sum,则将较大的数向前移动一位,即high--,此时变成了第一个和倒数第二个数相加,如果小于sum,则将较小的数向后移动一位,即low++,此时变成了第二个和最后一个数相加,依此类推,如果low==high时还未找到和为sum的一组数,则返回false。该算法的时间复杂度为O(n),空间复杂度为O(1)。
实现代码如下:
<span style="font-size:18px;">// offer01.cpp : 定义控制台应用程序的入口点。//#include "stdio.h"//在升序数组A中找出和为sum的任意两个元素,并且保存在a和b中 bool FindNumSum(int *A,int len,int sum,int *a,int *b){if(A==NULL||len<2||A[0]>sum)return false;int low=0;int high=len-1;while(low<high){if(A[low]+A[high]==sum){*a=A[low]; *b=A[high];return true;}else if(A[low]+A[high]<sum)low++;elsehigh--;}return false;}//main 函数int main(){int n,k;static int A[1000000];while(scanf("%d %d",&n,&k)!=EOF){int i;for(i=0;i<n;i++){scanf("%d ",A+i);}int a,b;bool isFind=FindNumSum(A,n,k,&a,&b);if(isFind)printf("%d %d\n",a,b);elseprintf("-1 -1\n");}return 0;}</span>
参考一些资料:
针对该方法需要给出一些证明,证明如下:
该方法对任意的整数数组都适合,另外,要输出乘积最小的一组,没必要将所有的结果保存起来。
当a+b = c时,ab<=(a+b)^2/4,当且仅当a==b时,ab取得最大值,二者相差越远,乘积越小。
1 0
- 【剑指offer学习】求和为定值的两个数
- 【剑指offer学习】求和为定值的两个数(拓展)
- 【剑指offer】和为定值的两个数
- 《剑指Offer》和为定值的两个数
- 【剑指offer】和为定值的两个数
- 数据结构学习笔记6-寻找和为定值的两个数(二分查找)
- 面试算法学习-6-寻找和为定值的两个数
- 寻找两个数的和为定值的算法
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找满足和为定值的两个数
- 寻找和为定值的两个数/多个数
- 寻找和为定值的两个数
- 和为定值的两个(多个)数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- 寻找和为定值的两个数
- Linux 命令行操作(二)文件操作
- 抛弃LCDS和FMS,在tomcat下开发Red5应用(第五篇)-客户端和服务器端方法调用的参数传递
- Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读
- Redis 之 主从复制
- 如何解决Please ensure that adb is correctly located at......
- 【剑指offer学习】求和为定值的两个数
- XML和JSON笔记
- cocos2dx 一些动作带解释
- Django MTV模式详解
- 数据结构:栈和队列
- Mac与WinXP共享文件夹
- jsp fmt格式化数字
- 环境篇-04:Android工程编译和移植
- Unity3D-Layer