給你一個??n x 2
?的二維數組?points
?,它表示二維平面上的一些點坐標,其中?points[i] = [xi, yi]
?。
我們定義 x 軸的正方向為?右?(x 軸遞增的方向),x 軸的負方向為?左?(x 軸遞減的方向)。類似的,我們定義 y 軸的正方向為?上?(y 軸遞增的方向),y 軸的負方向為?下?(y 軸遞減的方向)。
你需要安排這?n
?個人的站位,這?n
?個人中包括 Alice 和 Bob 。你需要確保每個點處?恰好?有?一個?人。同時,Alice 想跟 Bob 單獨玩耍,所以?Alice 會以 Alice?的坐標為?左上角?,Bob 的坐標為?右下角?建立一個矩形的圍欄(注意,圍欄可能?不?包含任何區域,也就是說圍欄可能是一條線段)。如果圍欄的?內部?或者?邊緣?上有任何其他人,Alice 都會難過。
請你在確保 Alice?不會?難過的前提下,返回 Alice 和 Bob 可以選擇的?點對?數目。
注意,Alice 建立的圍欄必須確保 Alice 的位置是矩形的左上角,Bob 的位置是矩形的右下角。比方說,以?(1, 1)
?,(1, 3)
?,(3, 1)
?和?(3, 3)
?為矩形的四個角,給定下圖的兩個輸入,Alice 都不能建立圍欄,原因如下:
- 圖一中,Alice 在?
(3, 3)
?且 Bob 在?(1, 1)
?,Alice 的位置不是左上角且 Bob 的位置不是右下角。 - 圖二中,Alice 在?
(1, 3)
?且 Bob 在?(1, 1)
?,Bob 的位置不是在圍欄的右下角。
示例 1:
輸入:points = [[1,1],[2,2],[3,3]] 輸出:0 解釋:沒有辦法可以讓 Alice 的圍欄以 Alice 的位置為左上角且 Bob 的位置為右下角。所以我們返回 0 。
示例 2:
輸入:points = [[6,2],[4,4],[2,6]] 輸出:2 解釋:總共有 2 種方案安排 Alice 和 Bob 的位置,使得 Alice 不會難過: - Alice 站在 (4, 4) ,Bob 站在 (6, 2) 。 - Alice 站在 (2, 6) ,Bob 站在 (4, 4) 。 不能安排 Alice 站在 (2, 6) 且 Bob 站在 (6, 2) ,因為站在 (4, 4) 的人處于圍欄內。
示例 3:
輸入:points = [[3,1],[1,3],[1,1]] 輸出:2 解釋:總共有 2 種方案安排 Alice 和 Bob 的位置,使得 Alice 不會難過: - Alice 站在 (1, 1) ,Bob 站在 (3, 1) 。 - Alice 站在 (1, 3) ,Bob 站在 (1, 1) 。 不能安排 Alice 站在 (1, 3) 且 Bob 站在 (3, 1) ,因為站在 (1, 1) 的人處于圍欄內。 注意圍欄是可以不包含任何面積的,上圖中第一和第二個圍欄都是合法的。
提示:
2 <= n <= 1000
points[i].length == 2
-10^9 <= points[i][0], points[i][1] <= 10^9
points[i]
?點對兩兩不同。
分析:由于點的數量擴大到 10 的 3 次方,用三次循環的方法會超時。可以先將所有點按照橫坐標從小到大排序,橫坐標相同的按照縱坐標從大到小排序,這樣經過排序后所有點的點都是按照先左后右,先上后下的順序排列。之后枚舉左上角的點,檢查其它點是不是在它的右下方,以及是否滿足條件。
int cmp(const void *a,const void *b)
{int *aa=*(int**)a;int *bb=*(int**)b;if(aa[0]!=bb[0])return aa[0]-bb[0];return bb[1]-aa[1];
}
int numberOfPairs(int** points, int pointsSize, int* pointsColSize) {int ans=0;// qsort(points, pointsSize, sizeof(int*), compare);qsort(points,pointsSize,sizeof(int*),cmp);for(int i=0;i<pointsSize;++i){int left=points[i][0]-1,right=INT_MAX,up=points[i][1]+1,down=INT_MIN;for(int j=i+1;j<pointsSize;++j){if(points[j][0]>left&&points[j][0]<right&&points[j][1]>down&&points[j][1]<up)ans++,left=points[j][0],down=points[j][1];}}return ans;
}