zoukankan      html  css  js  c++  java
  • 求解N个值中最大的k个数,N远大于k

    该方法思想:将N个数分为N/K段,查找每一段的最大值,然后在N/k个最大值中选择一个最大值,然后在选择最大值的那段中,再选择一个最大值,一次类推直到完成K个最大值的选择

    时间复杂度接近O(n)

    代码如下:

    #include "stdafx.h"
    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    int getMaxFromArray(int numb[],int begIndex,int endIndex)
    {
    	int result=numb[begIndex];
    	int indexValue=begIndex;
    	for (int i=begIndex+1;i<endIndex;i++)
    	{
    		if (numb[i]>result)
    		{
    			result=numb[i];
    			indexValue=i;
    		}
    	}
    	numb[indexValue]=INT_MIN;
    	return result;
    }
    int main()
    {
    	int numb[1000];
    	int n;
    	while (scanf("%d",&n)!=EOF)
    	{
    		for (int i=0;i<n;i++)
    		{
    			scanf("%d",numb[i]);
    		}
    		int k;
    		scanf("%d",&k);
    		if (k>=n)
    		{
    			for (int i=0;i<n;i++)
    			{
    				printf("%d ",numb[i]);
    			}
    		}else
    		{
    			int interval=n/k;
    			int *tmp=new int[k];
    			int *result=new int[k];
    			int begindex=0,endIndex=0;
    			for (int i=1;i<=k;i++)
    			{
    				endIndex=i*interval;
    				tmp[i-1]=getMaxFromArray(numb,begindex,endIndex);
    				begindex=endIndex;
    			}
    			int maxValue=tmp[0];
    			int indexValue=0;
    			int copyK=k-1;
    			for (int i=1;i<k;i++)
    			{
    				if (tmp[i]>maxValue)
    				{
    					maxValue=tmp[i];
    					indexValue=i;
    				} 
    			}
    			result[0]=maxValue;
    			while (copyK)
    			{
    				tmp[indexValue]=getMaxFromArray(numb,(indexValue-1)*interval,indexValue*interval);
    				maxValue=tmp[0];
    				indexValue=0;
    				for (int i=1;i<k;i++)
    				{
    					if (tmp[i]>maxValue)
    					{
    						maxValue=tmp[i];
    						indexValue=i;
    					}
    				}
    				result[k-copyK]=maxValue;
    				copyK--;
    			}
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    ZOJ
    Clock(数学题)
    The Lucky Week(规律)
    POJ 3233 Matrix Power Series
    POJ 1061 青蛙的约会(扩展欧几里德算法)
    2266: number
    2263: neighbor
    2269: minval(优先队列)
    HDU
    Problem 2150 Fire Game (广搜+枚举)
  • 原文地址:https://www.cnblogs.com/csxf/p/3460329.html
Copyright © 2011-2022 走看看