找出穿过间隔最多的点

问题:

给一组间隔,找出一个点,使得穿过该点的间隔数最大, 时间复杂度不能超过 O(N lg N)。比如有一组间隔为[1, 5] [ 3, 7] [2, 4] [8, 9], 那么对于点 3.5, 有3个间隔都包含这个点,但是对于点 8.5,只有一个间隔包含该点。所以,最后答案是 3.5. (当然,3.6, 或者 3.7 都可以)。

分析:

对于一组间隔,我们把它所有间隔的起始值和结束值放在一起排序,每遇到一个间隔的起始值,我们把个数加1,遇到一个结束值,我们把个数减1,这样,我们可以得到最大个数。对于 “点” 的值,它一定是在一个结束值和一个起始值之间。

代码如下:

public class Test {
	/*
	 * start: stores the start value of the intervals;
	 * end: stores the end value of the intervals
	 */
	public float findPoint(float[] start, float[] end) {
		
		int currentInterval = 0;
		int maximumInterval = 0;
		
		float pointBeginValue = 0.0f;
		float pointValue = 0.0f;
		//store the interval start values into the list
		ArrayList<Point> list = new ArrayList<Point>();
		for (int i = 0; i < start.length; i++) {
			list.add(new Point(start[i], true));
		}
		//store the interval end values into the list
		for (int j = 0; j < end.length; j++) {
			list.add(new Point(end[j], false));
		}
		//sort
		Collections.sort(list);
		
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).bStart) {
				currentInterval++;
				if (currentInterval >= maximumInterval) {
					maximumInterval = currentInterval;
					pointBeginValue = list.get(i).value;
				}
			} else {
				if (currentInterval == maximumInterval) {
					pointValue = (pointBeginValue + list.get(i).value) / 2.0f;
				}
				currentInterval--;
			}				
		}
		return pointValue;
	}
	
	public static void main(String[] args) {
		//start value of the interval
		float[] start = {1.2f, 3, 5, 1, 2.4f};
		//end value of the interval
		float[] end = {2.3f, 4.5f, 7.9f, 2, 4};
		System.out.println(new Test().findPoint(start, end));
	}
}

class Point implements Comparable<Point>{
	float value = 0.0f;
	boolean bStart = false;
	
	Point(float value, boolean bStart) {
		this.value = value;
		this.bStart = bStart;
	}

	public int compareTo(Point o) {
		if (value > ((Point)o).value ) {
				return 1;
		} else if (value == ((Point)o).value) {
				return 0;
		}
		return -1;
	}
}

参考:http://haixiaoyang.wordpress.com/2012/03/19/find-the-point-intersect-with-most-intervals/

转载请注明出处:http://blog.youkuaiyun.com/beiyeqingteng



现在设计一个涂胶机软件,需要给一个平面圆进行等间距螺旋线涂布作业,给定以下参数的前提下,帮我生成该算法的C语言代码: 1.以tPoint1、tPoint2、tPoint3结构体提供三个的坐标,结构体内包含浮型x/y/z坐标,根据这三个不在同一直线的生成一个圆(三在同一直线时错误返回),涂布时由tPoint1为起向tPoint2方向螺旋(假定后续bSequence参数为TRUE情况下)。 2.以整形变量“wIntervalsNum”间隔数量参数确定等间距阿基米德螺旋线的笔数,间隔数量参数等于一条穿过圆心与tPoint1的直线与等间距阿基米德螺旋线的交数量减1。该参数取值范围2~100。 3.布尔变量“bSequence”涂布顺序参数,bSequence==TRUE时由外向内生成阿基米德螺旋线、bSequence==FALSE由内向外生成阿基米德螺旋线。 4.浮型变量“fInsideCircleDiameter”内圆直径参数,该参数用于描述该圆型涂布中,中间部分不需要涂布区域的圆的直径,形成一个圆环涂布。该参数取值范围为0~圆直径(参数值大于圆直径时,返回错误)。当参数值为0时,整圆都涂满;该参数大于0时,则涂布效果是一个圆环,圆环以内的阿基米德螺旋线不需要。内圆与外圆之间需要等间距螺旋。 5.布尔变量“bOutsideCircle”参数,该参数为TRUE时,除了生成等间距阿基米德螺旋线以外,需要单独再走一遍这个平面圆轨迹。 6.布尔变量“bInsideCircel”参数,当fInnerCircleDiameter大于0进行圆环涂布时,bInsideCircel为TRUE则在圆环的内圆位置走一遍平面圆轨迹。 7.按照弓高误差为0.015打散轨迹生成各个打印出来。
最新发布
03-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值