【LetMeFly】3025.人员站位的方案数 I:既然是I,那就先暴力吧(三层循环)
力扣题目链接:https://leetcode.cn/problems/find-the-number-of-ways-to-place-people-i/
给你一个 n x 2
的二维数组 points
,它表示二维平面上的一些点坐标,其中 points[i] = [xi, yi]
。
计算点对 (A, B)
的数量,其中
A
在B
的左上角,并且- 它们形成的长方形中(或直线上)没有其它点(包括边界)。
返回数量。
示例 1:
输入:points = [[1,1],[2,2],[3,3]]
输出:0
解释:
没有办法选择 A
和 B
,使得 A
在 B
的左上角。
示例 2:
输入:points = [[6,2],[4,4],[2,6]]
输出:2
解释:
- 左边的是点对
(points[1], points[0])
,其中points[1]
在points[0]
的左上角,并且形成的长方形内部是空的。 - 中间的是点对
(points[2], points[1])
,和左边的一样是合法的点对。 - 右边的是点对
(points[2], points[0])
,其中points[2]
在points[0]
的左上角,但points[1]
在长方形内部,所以不是一个合法的点对。
示例 3:
输入:points = [[3,1],[1,3],[1,1]]
输出:2
解释:
- 左边的是点对
(points[2], points[0])
,其中points[2]
在points[0]
的左上角并且在它们形成的直线上没有其它点。注意两个点形成一条线的情况是合法的。 - 中间的是点对
(points[1], points[2])
,和左边一样也是合法的点对。 - 右边的是点对
(points[1], points[0])
,它不是合法的点对,因为points[2]
在长方形的边上。
提示:
2 <= n <= 50
points[i].length == 2
0 <= points[i][0], points[i][1] <= 50
points[i]
点对两两不同。
解题方法:三层循环模拟
第一层循环使用 i i i和 j j j分别枚举每个点,如果 i ≠ j i\neq j i=j并且 p o i n t s [ i ] points[i] points[i]在 p o i n t s [ j ] points[j] points[j]的左上方,则继续:
第三层循环使用 k k k再次枚举每个点,枚举之前使用一个变量 c a n = t r u e can=true can=true。如果 p o i n t s [ k ] points[k] points[k]在 p o i n t s [ i ] points[i] points[i]和 p o i n t s [ j ] points[j] points[j]的中间,则令 c a n = f a l s e can=false can=false并退出第三层循环。
如果第三层循环没有将 c a n can can设置为 f a l s e false false,则答案数量加一。
- 时间复杂度 O ( l e n ( p o i n t s ) 3 ) O(len(points)^3) O(len(points)3)
- 空间复杂度 O ( 1 ) O(1) O(1)
AC代码
C++
/*
* @Author: LetMeFly
* @Date: 2025-09-02 13:08:07
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-09-02 13:51:14
* @Description: rewrite from 0
*/
class Solution {
private:
inline bool check(vector<vector<int>>& points, int i, int j) {
return i != j && points[i][0] <= points[j][0] && points[i][1] >= points[j][1];
}
inline bool check(vector<vector<int>>& points, int i, int j, int k) {
return !(points[i][0] <= points[k][0] && points[k][0] <= points[j][0]
&& points[i][1] >= points[k][1] && points[k][1] >= points[j][1]);
}
public:
int numberOfPairs(vector<vector<int>>& points) {
int ans = 0;
for (int i = 0; i < points.size(); i++) {
for (int j = 0; j < points.size(); j++) {
if (!check(points, i, j)) {
continue;
}
bool can = true;
for (int k = 0; k < points.size(); k++) {
if (k == i || k == j) {
continue;
}
if (!check(points, i, j, k)) {
can = false;
break;
}
}
ans += can;
}
}
return ans;
}
};
C++ —— 原始版本(思考过程)可跳过
/*
* @Author: LetMeFly
* @Date: 2025-09-02 13:08:07
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-09-02 13:45:45
*/
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endif
class Solution {
private:
inline bool check(vector<vector<int>>& points, int i, int j) { // 易错点3:单独的(i, j)也要check
if (points[i][0] > points[j][0] || points[i][1] < points[j][1]) { // 易错点1:注意这里纵坐标大于等于才合法
return false;
}
return true;
}
inline bool check(vector<vector<int>>& points, int i, int j, int k) {
if (points[i][0] <= points[k][0] && points[k][0] <= points[j][0] && points[i][1] >= points[k][1] && points[k][1] >= points[j][1]) {
return false;
}
return true;
}
public:
int numberOfPairs(vector<vector<int>>& points) {
int ans = 0;
for (int i = 0; i < points.size(); i++) {
for (int j = 0; j < points.size(); j++) {
if (i == j) {
continue;
}
if (!check(points, i, j)) {
continue;
}
bool can = true; // 易错点2:有一个k导致不符就不符
for (int k = 0; k < points.size(); k++) {
if (k == i || k == j) {
continue;
}
if (!check(points, i, j, k)) {
can = false;
break;
}
}
ans += can;
}
}
return ans;
}
};
#if defined(_WIN32) || defined(__APPLE__)
/*
[[1,1],[2,2],[3,3]]
0
*/
/*
[[0,0],[0,3]]
1
*/
/*
[[6,2],[4,4],[2,6]]
(2,1) (1, 0)
2
*/
/*
[[0,0],[0,3]]
1
*/
int main() {
string s;
while (cin >> s) {
vector<vector<int>> v = stringToVectorVector(s);
Solution sol;
cout << sol.numberOfPairs(v) << endl;
}
return 0;
}
#endif
Python
'''
Author: LetMeFly
Date: 2025-09-02 13:08:07
LastEditors: LetMeFly.xyz
LastEditTime: 2025-09-02 18:47:49
'''
from typing import List
class Solution:
def check2(self, i: int, j: int) -> bool:
return self.points[i][0] <= self.points[j][0] and self.points[i][1] >= self.points[j][1]
def check3(self, i: int, j: int, k: int) -> bool:
return not (self.points[i][0] <= self.points[k][0] <= self.points[j][0] and self.points[i][1] >= self.points[k][1] >= self.points[j][1])
def numberOfPairs(self, points: List[List[int]]) -> int:
ans = 0
n = len(points)
self.points = points
for i in range(n):
for j in range(n):
if i == j:
continue
if not self.check2(i, j):
continue
can = True
for k in range(n):
if k == i or k == j:
continue
if not self.check3(i, j, k):
can = False
break
ans += can
return ans
Go
/*
* @Author: LetMeFly
* @Date: 2025-09-02 13:08:07
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-09-02 18:53:07
*/
package main
func check2_3025(points [][]int, i, j int) bool {
return points[i][0] <= points[j][0] && points[i][1] >= points[j][1]
}
func check3_3025(points [][]int, i, j, k int) bool {
return !(points[i][0] <= points[k][0] && points[k][0] <= points[j][0] &&
points[i][1] >= points[k][1] && points[k][1] >= points[j][1])
}
func numberOfPairs(points [][]int) (ans int) {
for i := range points {
for j := range points {
if i == j {
continue
}
if !check2_3025(points, i, j) {
continue
}
can := true
for k := range points {
if k == i || k == j {
continue
}
if !check3_3025(points, i, j, k) {
can = false
break
}
}
if can {
ans++
}
}
}
return
}
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源