程式設計之美 2 19 區間重合判斷

2021-08-21 09:37:53 字數 1935 閱讀 4064

/**

* 給定乙個源區間[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中用二分查詢來...