Every day a Leetcode
题目来源:3015. 按距离统计房屋对数目 I
解法1:暴力
暴力枚举每一个房屋对 (i, j) 的 3 种路径:
- i->j:长度为 len1 = j-i;
- i->x->y->j:长度为 len2 = abs(i - x) + 1 + abs(j - y);
- i->y->x->j:长度为 len3 = abs(i - y) + 1 + abs(j - x)。
取这 3 种路径的最小值作为房屋对 (i, j) 的路径,路径长度 len = min({len1, len2, len3}),因为路径是双向的,在答案数组 ans 中 ans[len - 1] += 2。
最后返回 ans 数组。
代码:
/*
* @lc app=leetcode.cn id=3015 lang=cpp
*
* [3015] 按距离统计房屋对数目 I
*/
// @lc code=start
class Solution
{
public:
vector<int> countOfPairs(int n, int x, int y)
{
vector<int> ans(n, 0);
for (int i = 1; i < n; i++)
for (int j = i + 1; j <= n; j++)
{
int len1 = j - i; // i->j
int len2 = abs(i - x) + 1 + abs(j - y); // i->x->y->j
int len3 = abs(i - y) + 1 + abs(j - x); // i->y->x->j
// 取最短距离作为路径
int len = min({len1, len2, len3});
ans[len - 1] += 2; // 路径是双向的
}
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n2),其中 n 是房屋数量。
空间复杂度:O(n),其中 n 是房屋数量。