lintcode计算最大间距

1 篇文章 0 订阅
1 篇文章 0 订阅
//桶排序计算最大间距

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct tagBucket
{
	int nMin;
	int nMax;
	bool isValid;
	tagBucket():isValid(false){};
	void add_(int val)
	{
		if(isValid)
		{
			if(val<nMin)
				nMin=val;
			if(val>nMax)
				nMax=val;
		}
		else
		{
			nMax=nMin=val;
			isValid=true;
		}
	}
};

int CalcMaxGap(vector<int>&a,int len,int nMax,int nMin)
{
	int Max_Gap=0;
	int delta=nMax-nMin;
	tagBucket *bucket=new tagBucket[len];
	for (int i=0;i<len;i++)
	{
		int pos=(a[i]-nMin)*len/delta;
		if (pos==len)
			pos--;
		bucket[pos].add_(a[i]);
	}

	int j=0;
	for (int i=1;i<len;i++)
	{
		if (bucket[i].isValid)
		{
			int gap=bucket[i].nMin-bucket[j].nMax;
			if (gap>Max_Gap)
			{
				Max_Gap=gap;
			}
			j=i;
		}
	}
	return Max_Gap;
}

int main()
{
	int a[8]={36,94,35,42,86,14,85,33};
	int nMin=*min_element(a,a+8);
	int nMax=*max_element(a,a+8);
	vector<int> a_(a,a+8);
	int rec=CalcMaxGap(a_,a_.size(),nMax,nMin);
	cout<<"最大间距为:"<<rec;

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值