在升序数组中选取2个数,使其和等于一个输入数字n
来源:互联网 发布:学编程需要英语吗 编辑:程序博客网 时间:2024/05/16 08:37
题目描述
这是一道某互联网公司的面试题,输入为一个以按升序排序好的数组和一个数字n,要求在数组中查找两个数,使得他们的和正好等于那个输入数字n。如果有多对数字的和等于n,输出任意一对即可。
朴素解法
使用两个变量i和j,利用两层循环遍历数组,当遇到data[i]+data[j]等于输入数字,并且i不等于j的时候,输出data[i]和data[j],即找到了所求的两个数字。下面是这种解法的代码:
void find1(int *data,int num){assert(NULL!=data);int i=0;int j=0;for(i=0;i<len;i++)for(j=0;j<len;j++){if((i!=j)&&((data[i]+data[j])==num)){printf(" %d + %d = %d \n",data[i],data[j],num);return;}}printf(" not find them \n");return;}
很容易看出,这种解法的时间复杂度是o(n^2),并且没有充分利用升序数组这一条件。
更加合理的解法
我们可以用两个变量找到数组的第一个元素和最后一个元素,即数组最小值和最大值。当这两个数字的和等于输入数字n,则输出结果即可。若两个数字的和小于n,则向右移动指向较小值的变量;若两个数字的和大于n,则向左移动指向较大值的变量。判断结束的条件是两个变量重合。
下面是这种解法的代码:
void find2(int *data,int num){assert(NULL!=data);int i=0;int j=len-1;while(i<j){if((data[i]+data[j])==num){printf(" %d + %d = %d \n",data[i],data[j],num);return;}else if((data[i]+data[j])< num){i++;}else{j--;}}printf(" not find them \n");return;}
小结
很显然,第二种解法的时间复杂度是o(n),要优于第一种的解法,并且能够充分利用题目中升序数组的条件。
- 在升序数组中选取2个数,使其和等于一个输入数字n
- 一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好等于输入的那个数字
- 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,
- 输入一个按照升序排列的数组和一个数字,在数组中查找两个数,使得他们的和正好是输入的那个数字,要求时间复杂度是O(n),如果有多对数字的和等于输入的数字,输入任意一对即可。
- 微软100道算法题-----输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对
- 第14题:查找升序数组中的两数,使其和为输入数字
- 输入两个整数n和m,从0-n中随意取几个数,使其和等于m
- 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。实际上就是一个背包问题
- 中兴面试题 : 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m. --java算法解决方法。
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数,使其和等于m
- 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m
- 输入两个整数n和m,从数列1,2,3....n中随意取几个数,使其和等于m
- 动态规划——5 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m
- 《动态规划》 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m
- 输入两个整数n和m,从数列1,2,3...n中随意取几个数,使其和等于m,要求列出所有的组合
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数,使其和等于m问题
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能..
- 输入两个整数n 和 m, 从数列1, 2, 3, ..., n中随意取几个数, 使其和等于m, 要求将所有组合列出来
- Android蓝牙API之BluetoothAdapter类
- 江苏镇江江堤一个月内第二次出现垮塌-决堤-坍塌-非法采砂
- 动态链接库的使用方法
- 指向void的指针
- 编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\yami
- 在升序数组中选取2个数,使其和等于一个输入数字n
- vs2010快捷键-- 摘
- JSP中获取session
- log4j.properties相关配置(1)
- java 反射之自定义注解
- Visual C++.NET GDI+编程基础
- SharePoint 2010 Step By Step : Customize Master Page(1)
- windows环境apache https配置宝典
- IOS UILabel 多行文字自动换行