• 有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度


    题目:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度。

    代码如下:

    #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[n];
    	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).

  • 相关阅读:
    代理模式
    建造者模式
    开源版本 hadoop-2.7.5 + apache-hive-2.1.1 + spark-2.3.0-bin-hadoop2.7整合使用
    Phoenix映射HBase数据表
    使用sqoop将mysql中表导入hive中报错
    数据库索引原理及优化(转载)
    6.JAVA知识点归纳整理
    5.hbase表新增数据同步之add_peer
    mongodb分布式集群搭建
    4.HBASE数据迁移方案(之snapshot):
  • 原文地址:https://www.cnblogs.com/pangblog/p/3315254.html
Copyright © 2020-2023  润新知