問題描述:
p為給定的二維平面整數點集。定義 p 中某點x,如果x滿足 p 中任意點都不在 x 的右上方區域內(橫縱座標都大於x),則稱其為「最大的」。求出所有「最大的」點的集合。(所有點的橫座標和縱座標都不重複, 座標軸範圍在[0, 1e9) 內)
如下圖:實心點為滿足條件的點的集合。請實現**找到集合 p 中的所有 」最大「 點的集合並輸出。
輸入描述:
第一行輸入點集的個數 n, 接下來 n 行,每行兩個數字代表點的 x 軸和 y 軸。
對於 50%的資料, 1 <= n <= 10000;
對於 100%的資料, 1 <= n <= 500000;
輸出描述:
輸出「最大的」 點集合, 按照 x 軸從小到大的方式輸出,每行兩個數字分別代表點的 x 軸和 y軸。
示例1
輸入輸出5 1 2
5 3
4 6
7 5
9 0
4 6思路:本題通俗的說就是在平面上找點集的右邊和上邊邊界。這裡考慮先找到點集中「最右邊」的點(px,py),那麼其餘邊界點一定存在於這個點的左上方,也就是滿足(x < px 且 y > py),並且邊界點的縱座標從左到右依次下降。(示例圖中紅色點符合這個規律)7 5
9 0
對點進行排序,排序之後的點集是按照從左到右,從上到下的順序,那麼最後乙個點就是最右邊的點。記錄邊界點中的最高y值 max_y ,按照排序從後往前遍歷所有點,如果這個點y值比 max_y 要大,那麼這個點一定是邊界點,計入結果集,並更新max_y為當前點y值。
**實現如下:
# 這段**在牛客中ac 80%,判斷超記憶體了
deffindpoints
(): nums = int(input())
points =
result =
for i in range(0, nums):
points.sort()
# 先確定最右邊的點p,其餘的邊界點一定是y>py,xmax_x2y = points[- 1][1]
# 倒著往回找點
for j in range(nums - 2, -1, -1):
if points[j][1] > max_x2y:
max_x2y = points[j][1]
while len(result) > 0:
point = result.pop()
print(point[0], point[1])
每日一題 合併集合
一共有 n 個數,編號是 1 n,最開始每個數各自在乙個集合中。現在要進行 m 個操作,操作共有兩種 m a b,將編號為 a 和 b 的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作 q a b,詢問編號為 a 和 b 的兩個數是否在同乙個集合中 輸入格式 第一行輸入整數 n ...
LeetCode每日一題 集合問題
子集問題,看到這種題,肯定是可以用dfs加遞迴可以做的。首先分析思路,這種類似於全排列的情況,並且順序不同算一種的話,其實就只要遞迴遍歷就可以了 這題其實就是類似於全排列的問題,顯而易見的是順利不同的組合算是乙個,例如 1,2,3 1,3,2 因為陣列中的元素是排序且無重複的,因此只需要考慮在遞迴進...
每日一題 some小問題集合
classa object defshow self print this is the a show classb object defshow self print this is the b show obj b obj.show obj.class a obj.show this is th...