桶找相邻差值最大

定一组无序数据,输出排序过后的相邻两个数字最大的差值 分析:

利用桶来找最大差值,有n个数,就找n+1个桶,必定有一个桶为空,这样就排除了同一个桶差值最大的可能性,但没排除相邻桶差值最大的可能性,找两个数组,一个记录每个桶中的数字的最大值,一个记录每个桶中的数字的最小值,根据最小值减上一个桶中的最大值再来找差值最大的 需要注意的是,只有桶中有数字才看该桶最大值和最小值

#include<iostream> 
#include<cstring>
using namespace std;
int bucket(int a ,int min ,int max, int len);
int sub(int* a,int len);
int sub(int* a,int len)
	{
		int Max=0;
		int Min=0;
		
		for (int k=0;k<len;k++)
		{
			Max=max(Max,a[k]);
			Min=min(Min,a[k]);
		}
		if (Max== Min) 
		{
			return 0;
		}
		bool* hasnum = new bool[len+1];
		int* maxs = new int [len+1];  //初始桶都为空 
		int* mins = new int[len+1];
		memset(hasnum,0,len+1);
		for(int k=0;k<len;k++)
		{
			int bid = bucket(a[k],Min, Max,len);
			mins[bid] = hasnum[bid] ? min(mins[bid],a[k]) : a[k];
			maxs[bid] = hasnum[bid] ? max(mins[bid],a[k]) : a[k];
			hasnum[bid] = true;
	    }
	    int lastmax = maxs[0];
	    int i=1;
	    int res = 0;
//	    for(int k=0;k< len;k++)
//	    {
//	    	cout<< k<<"  "<< mins[k]<<"  "<< maxs[k]<<"  "<< hasnum[k]<< endl;
//		}
//		
//		
//		cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
	    for(;i<=len;i++)
	    {
	    	if (hasnum[i]) //只有桶中有数字才比较
	    	{
	    	res = max(mins[i] - lastmax,res);
	    	lastmax = maxs[i];
	    	cout<<res<<endl; 
	        }
		}
	return res;
	}

int bucket(int a ,int min ,int max, int len)  //放入那个桶的捅号 
{
	return (int) ((a-min) * len /(max-min));
}

int main()
{
	int* a = new int[11]{12,5,3,8,22,8,51,9,73,52};
	cout<<sub(a,10)<<endl;
}