就...那篇解題報告用的方法 用PriorityQueue 加上自訂的類別(Pair)、comparator(用在PriorityQueue排序的)解的
首先先來定義 蹲下的總人數為 count 以及 pq
PriorityQueue <Pair> pq = new PriorityQueue <Pair> (new Comparator <Pair>(){
@Override
public int compare(Pair a, Pair b){
if(a.b == b.b) // b -> begin, e -> end
return a.e - b.e;
return a.b - b.b;
}
});
將所有區間都offer()到pq內後
一次讀取兩個區間(這裡以 a 以及 b 作為代表) 判斷2者的關係
如果a b沒有重疊 那就把 count += a區間的人數, 把b丟回pq內
如果a b重疊 並且a的結尾被包含在b區間中 那就把 count += a的開頭~b的開頭 然後把後面沒有重疊的區間 丟入pq內
最後一種情況 就是b被包含在a中 一樣 count += 前面沒有重疊的部分 然後把後面沒有重疊的區間丟入pq中
重複動作 直到pq.size() < 2
如果 !pq.isEmpty()
就把區間給poll()出來 然後count += 該區間大小
最後輸出 總人數 - count
剛剛在本題狀況中看到你有AC,想請問大概是使用甚麼方式,謝謝!就...那篇解題報告用的方法 用PriorityQueue 加上自訂的類別(Pair)、comparator(用在PriorityQueue排序的)解的
首先先來定義 蹲下的總人數為 count 以及 pq
PriorityQueue pq = new PriorityQueue (new Comparator (){
@Override
public int compare(Pair a, Pair b){
if(a.b == b.b) // b -> begin, e -> end
return a.e - b.e;
return a.b - b.b;
}
});
將所有區間都offer()到pq內後
一次讀取兩個區間(這裡以 a 以及 b 作為代表) 判斷2者的關係
如果a b沒有重疊 那就把 count += a區間的人數, 把b丟回pq內
如果a b重疊 並且a的結尾被包含在b區間中 那就把 count += a的開頭~b的開頭 然後把後面沒有重疊的區間 丟入pq內
最後一種情況 就是b被包含在a中 一樣 count += 前面沒有重疊的部分 然後把後面沒有重疊的區間丟入pq中
重複動作 直到pq.size() < 2
如果 !pq.isEmpty()
就把區間給poll()出來 然後count += 該區間大小
最後輸出 總人數 - count
大概了解了,謝謝
剛剛在本題狀況中看到你有AC,想請問大概是使用甚麼方式,謝謝!就...那篇解題報告用的方法 用PriorityQueue 加上自訂的類別(Pair)、comparator(用在PriorityQueue排序的)解的
首先先來定義 蹲下的總人數為 count 以及 pq
PriorityQueue pq = new PriorityQueue (new Comparator (){
@Override
public int compare(Pair a, Pair b){
if(a.b == b.b) // b -> begin, e -> end
return a.e - b.e;
return a.b - b.b;
}
});
將所有區間都offer()到pq內後
一次讀取兩個區間(這裡以 a 以及 b 作為代表) 判斷2者的關係
如果a b沒有重疊 那就把 count += a區間的人數, 把b丟回pq內
如果a b重疊 並且a的結尾被包含在b區間中 那就把 count += a的開頭~b的開頭 然後把後面沒有重疊的區間 丟入pq內
最後一種情況 就是b被包含在a中 一樣 count += 前面沒有重疊的部分 然後把後面沒有重疊的區間丟入pq中
重複動作 直到pq.size() < 2
如果 !pq.isEmpty()
就把區間給poll()出來 然後count += 該區間大小
最後輸出 總人數 - count
感謝,現在AC了