XX公司综合机试题第二题,以前有人讨论过,这里列出不同的算法
2.请实现一个函数:线段重叠; 输入多个一维线段,求出这些线段相交的所有区域(也用线段表示); 一条线段用两个值表示(x0,x1), 其中x1>x0;比如: 输入线段数组[(2,4),(1.5,6),(0.5,3.5),(5,7),(7.5,9)], 输出线段数组[(1.5,4),(5,6)]
public static Float[][] doTest(Float[][] array) {
float[] temp = new float[array.length * 2];
int[] count = new int[array.length * 2];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
temp[i * array[i].length + j] = array[i][j];
}
}
Arrays.sort(temp);
float x = 0f;
float y = 0f;
for (int i = 0; i < array.length; i++) {
x = array[i][0];
for (int j = 1; j < array[i].length; j++) {
y = array[i][j];
for (int k = 0; k < temp.length; k++) {
if (temp[k] >= x && temp[k] < y)
++count[k];
}
}
}
List<List<Float>> resultList = new LinkedList<List<Float>>();
List<Float> list = null;
int flag = 0;
for (int i = 0; i < count.length; i++) {
if (count[i] > 1 && flag == 0) {
flag = 1;
list = new LinkedList<Float>();
list.add(temp[i]);
} else if (count[i] > 1 && flag == 1) {
} else if (count[i] == 1 && flag == 1) {
flag = 0;
list.add(temp[i]);
resultList.add(list);
list = null;
}
}
if (resultList.size() > 0) {
Float[][] result = new Float[resultList.size()][2];
for (int i = 0; i < resultList.size(); i++) {
list = resultList.get(i);
for (int j = 0; j < list.size(); j++) {
result[i][j] = list.get(j);
}
}
return result;
} else
return null;
}
分享到:
相关推荐
查询一个区间的信息时,从根节点开始,按照与更新类似的方式向下遍历,但这次是根据节点覆盖的区间与查询区间重叠的程度来选择左子树或右子树,最后将所有相关节点的值合并得到结果。 **优化** 线段树可以进一步...
首先,线段树的核心思想是将线性区间分解成多个重叠的小区间,通过二叉树结构存储这些小区间,从而实现对区间数据的快速查询和更新。在给定的问题中,我们需要在给定的自然数范围内处理大量线段,并对每个点进行询问...
`build`函数用于初始化线段树,`update`函数用于更新某个节点的值(即对数组中的一个元素进行增减操作),`query`函数则用于查询某区间内的元素之和。例如,HDOJ 1166题目的解决方案就展示了如何用线段树处理区间...
通过以上分析,我们可以看出,线段树在C++中的实现涉及到了树的数据结构、递归算法、动态内存管理等多个方面,是理解和运用高级数据结构解决实际问题的一个典型示例。在处理几何问题时,线段树的灵活性和高效性使其...
本篇文章通过分析一个简单的线段树遍历示例,介绍了线段树的基本概念、节点结构以及查询算法的实现细节。在实际应用中,线段树不仅可以支持区间求和,还可以支持诸如区间最小/最大值、区间乘积等多种类型的操作。...
- `mul(bint a, type b, bint &c)`:实现一个大数和一个小数相乘,结果存入`c`,需要注意小数应该小于`base`。 - `mul(bint a, bint b, bint &c)`:实现两个大数相乘,结果存入`c`。 - `div(bint a, type b, bint...
线段树是由一个完全二叉树形成的结构,每个节点代表一个区间,根节点代表整个数组,叶子节点则对应原数组的元素。非叶子节点的值通常由其两个子节点的值组合得出,如求最大值时,非叶子节点的值为子节点中的最大值。...
在窗口星星问题中,线段树需要处理二维坐标,可能需要使用一个四叉树或者两个一维线段树来实现。 总的来说,理解和熟练应用线段树是解决这类问题的关键,同时注意优化代码以满足时间和空间限制。在实现过程中,要...
例如,`point_t` 结构体用于表示一个点的坐标,`lineseg_t` 结构体用于表示一条线段的两个端点。`cross` 函数用于计算叉积,`dot` 函数用于计算点积,`length` 函数用于计算两点间的距离。`isOn` 函数用于判断点是否...
线段树的构建基于树形二分结构,允许对一个区间进行快速的求和、查找最大值、最小值等操作,并在区间元素的插入、删除或修改时保持这些信息的正确性。 线段树的基本思想是将一维数组划分成若干个连续的子区间,然后...
1. OpenGL架构:OpenGL是一个跨语言、跨平台的编程接口,由OpenGL规格定义,硬件制造商提供实现。它提供了一组函数调用来控制图形处理器(GPU)。 2. 图形管线:OpenGL的核心是图形管线,它将渲染过程分为多个阶段,...
- 当涉及到两个或多个动态元素时,需要分析它们之间的相对位置变化,例如矩形和动点的移动,以及它们与直线的关系。 3. 梯形和直角坐标系中的几何问题: - 梯形的性质:知道底边长度和高可以计算梯形的面积。 - ...
接着,会有一个初始化函数来创建一个空的线段树,并分配内存。初始化时,通常会将每个叶子节点的区间设置为单个元素,非叶子节点的区间由其子节点的区间合并而来。 对于线段树的操作,有两个主要的部分:更新和查询...
该定理基于一个核心思想:如果两个多边形不相交,那么存在一个轴使得两个多边形的投影在该轴上没有重叠。具体步骤包括: 1. **投影**:将多边形的每条边沿所有可能的轴进行投影。 2. **比较**:找到这两个多边形的...
- 当一个点在直线上移动时,根据点的位置变化来计算动态的重叠面积,可能需要利用几何变换和积分概念。 7. **应用题解题步骤**: - 分析题目中的几何图形,理解各个元素之间的关系。 - 列出方程式,通过代数方法...
当等腰直角三角形在坐标平面上移动时,其直角顶点的轨迹可能是一个一次函数,这要求学生理解直角三角形的性质和点的坐标变化规律。 9. **线段上的动点与函数关系**: 如题中所示,点 P 在线段 AB 上移动,涉及到...
线段树本质上是一棵二叉树,其每个节点代表一个区间[L, R],其中L和R分别是该区间的左右端点。根据线段树的定义,我们可以了解到以下关键信息: - **根节点**:代表整个区间的范围,例如[1, N]。 - **子节点**:...
2. OpenGL 函数理解:glDisk 函数用于绘制圆盘,若想绘制一个没有空心的圆盘,innerRadius 应设置为 0,使其与 outerRadius 相同。 3. OpenGL 几何图元:GL_LINES 表示一系列的直线连接,用于绘制线段。 4. 矢量...
GetOverlappedResult 判断一个重叠操作当前的状态 GetPrivateProfileInt 为初始化文件(.ini文件)中指定的条目获取一个整数值 GetPrivateProfileSection 获取指定小节(在.ini文件中)所有项名和值的一个列表 ...