/**
* 給定乙個源區間[x, y](y >= x)和n個無序的目標區間[x1, y1], [x2, y2], ..., [xn, yn], 判斷源區間[x, y]是不是在目標區間內
* eg, 給定乙個源區間[1, 6]和一組無序的目標區間[2, 3][1, 2][3, 9], 即可認為[1, 6]在區間[2, 3][1, 2][3, 9]內(因為目標區間合併之後, 實質為[1, 9])
*/#include
struct area ;
void fastsort(struct area *interval, int begin, int end) else
}interval[i] = interval[j];
while(i < j && temp.begin >= interval[i].begin) else
}interval[j] = interval[i];
}interval[i] = temp;
fastsort(interval, begin, i - 1);
fastsort(interval, i + 1, end);
}/**
* 法一: 首先我想到的方法是將目標區間的序列中的區間合併起來, 盡可能合併所有的區間, 當剩餘的區間無法合併之後, 遍歷目標區間, 然後判斷源區間是否在其中的某個目標區間中.
* 首先對目標區間進行排序操作, 以x座標為主關鍵字進行排序, 當x座標相同時, 再以y座標為關鍵字進行排序.
* 當源區間在目標區間中時, 返回1; 不在返回0
* 複雜度分析: 採用快速排序, 時間複雜度為o(n * logn), 然後遍歷一次區間序列, 將可以合併的區間合併, 同時判斷該區間是否包含源區間, 時間複雜度為o(n), 因此總的時間複雜度為o(n + n * logn).
* 書中給出的解法二與我的方法類似, 首先給序列排序, 然後合併, 然後查詢, 但是書中的方法是將合併與查詢的過程分開了, 增加了時間複雜度.
* 在我的演算法中遍歷時, 從第乙個區間開始合併, 當合併到與下乙個區間不相鄰時, 判斷合併到現在的區間是否包含目標區間:
* 若包含, 返回1;
* 若未包含, 則判斷目標區間是否與合併區間交叉存在(即 area.begin <= source.begin <= area.end, source.end > area.end), 若是, 返回1.
* 若未包含且不交叉存在, 則給area賦值為序列中的下乙個區間, 重新開始合併判斷.
*/int judgement(struct area *destination, struct area source, int n)
if (area.begin <= source.begin && area.end >= source.end)
return 1;
if (area.begin <= source.begin && source.begin <= area.end && source.end > area.end)
return 0;
if (i < n)
}return 0;
}int main() , , };
//struct area destination = , , , , };
struct area destination = , , };
struct area source = ;
printf("%d\n", sizeof(destination) / sizeof(struct area));
if (judgement(destination, source, sizeof(destination) / sizeof(struct area)))
printf("源區間在目標區間中\n");
else
printf("源區間不在目標區間中\n");
return 0;
}
程式設計之美2 19 區間重合判斷
題目 給定乙個源區間 x,y y x 和n個無序的目標區間 x1,y1 x2,y2 x3,y3 xn,yn 判斷源區間 x,y 是不是在目標區間內?例如,給定源區間 1,6 和一組無序的目標區間 2,3 1,1 3,9 即可認為區間 1,6 在區間 2,3 1,1 3,9 內,因為目標區間實際上是 ...
程式設計之美 2 19 區間重合判斷
題目大意 給定源區間 x,y x y 和 n個無序的目標區間 xi,yi 1 i n 判斷源區間是否在目標區間內。分析 書中介紹了兩種解法。第一種 將目標區間投影到源區間,看最終未被覆蓋的區間是否變為。這種方法的複雜度無疑是很高的。o n 2 另外,對於k組源區間查詢,其複雜度是單次的k倍。第二種 ...
程式設計之美2 19區間重合判斷
區間重合判斷 比如,給出待判斷區間 x,y 如 1,6 以及目標區間 x1,y1 x2,y2 xi,yi 如 2,3 1,2 3,9 判斷 1,6 是否在目標區間中 做法 先把根據各個目標區間的第乙個元素xi排序 可用快排 然後將目標區間中可以合併的區間進行合併,然後 在目標區間的xi中用二分查詢來...