有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度
2013-09-11 19:15
435 查看
题目:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度。
代码如下:
时间复杂度度为O(n),空间复杂度为O(1).
代码如下:
#include<iostream> using namespace std; int min_diff(int data[],int n,int &min_i,int &min_j,int number); int main() { int number,n,i; cin>>number>>n; int *data=new int ; for(i=0;i<n;i++) cin>>data[i]; int min_i,min_j; int min_d=min_diff(data,n,min_i,min_j,number); int sum=0; for(i=min_i;i<min_j;i++) { sum=sum+data[i]; cout<<data[i]<<" + "; } sum=sum+data[i]; cout<<data[i]<<" = "<<sum<<endl; cout<<"The min difference with "<<number<<" is "<<min_d<<endl; delete []data; return 0; } int min_diff(int data[],int n,int &min_i,int &min_j,int number) { if(data==NULL||n<=0) return 0; int i=0,j=0; min_i=i; min_j=j; int min_d=0x7fffffff; int sum=data[0]; while(i<=j&&j<n) { if(sum==number) { min_i=i; min_j=j; min_d=0; break; } else if(sum>number) { if(sum-number<min_d) { min_d=sum-number; min_i=i; min_j=j; } sum=sum-data[i]; i++; } else { if(number-sum<min_d) { min_d=number-sum; min_i=i; min_j=j; } j++; sum=sum+data[j]; } } return min_d; }
时间复杂度度为O(n),空间复杂度为O(1).
相关文章推荐
- 有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。
- 搜狐笔试题:给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- 曾经遇到的一个面试题,快速排序用链表实现,算法和以前的相似,需要注意一些细节处理
- 有一堆扑克牌,其中某张牌的张数超过了扑克牌总数的一半,请找到这张牌。写出算法思路、代码实现和算法的时间复杂度,要求算法尽可能高效。假设给定一个扑克牌的数组poker和它的大小n,请返回所求的扑克牌。
- javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
- 对于一个m*n的整数矩阵,其中每一行和每一列的元素都按升序排列,设计一个高效的算法判断一个数值是否存在,并给出位置
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 给定一个数组,按序排列,从数组找出若干个数,使得这若干个数字的和与M最为接近,(背包问题)
- perfect shuffle 算法的一个线性复杂度实现
- 如何实现一个不规则排列的图片布局算法
- .定义两个数组,首先把两个数组合并成一个新数组,然后把新数组中的所有元素逆序排列,需要实现的效果如图-2所示。
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- android百度地图api 实现离线地图需要注意的一个问题
- javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 项目管理实战之团队管理 对团队的管理需要重视以下几个方面 一个系统不仅需要优秀的分析和设计,更需要一个良好的过程将其从蓝图转化为实现。这个过程中最重要的是对团队的管理,也就是人的管理
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Java实现
- 通过递归判断一个整形数组是否按升序排列(java实现)