区域个数问题,只不过行列都超大,无法在内存内搞数组来做。(下图来自《挑战程序竞赛》第二版 164页)
基本的做法就是进行矩阵压缩,使用坐标离散化的方法,对于行列的每个端点,加上做边的那个,再加上右边的那个,压入vector数组,排序,去除重复的元素,
然后用find方法找到端点的坐标,减去数组初始地址,便可求得压缩后的实际端点地址。
需要注意的又几点:
1. 程序中先排序,再使用了unique方法,unique 在数组中不是正真将重复的数据删去,只是讲重复的元素移到数组的末尾,比如:
{1,1,2,2,5,6,7} -> {1,2,5,6,7,1,2} 此时返回的是不重复的数组元素序列的最后一个元素的下一个元素地址(例子中为第二个1,类似于终止符的
作用);
2. 为了删除元素,要使用erase方法,讲上面所获得的元素地址到 数组末尾统统删除; 综合1,2 会有vector数组去重比较优雅的实现: