Leetcode第1620题:网络信号最好的坐标(Coordinate with maximum network quality)
解题思路
第一种:暴力枚举
题目给出坐标的范围是[0,50],可以直接枚举所有坐标点(i,j),计算每个坐标点的信号强度,然后找出信号强度最大的坐标点。
核心代码如下:
class Solution {
public:
vector<int> bestCoordinate(vector<vector<int>>& towers, int radius) {
int mx = 0;
vector<int> ans = {0, 0};
for (int i = 0; i < 51; ++i) {
for (int j = 0; j < 51; ++j) {
int t = 0;
for (auto& e : towers) {
double d = sqrt((i - e[0]) * (i - e[0]) + (j - e[1]) * (j - e[1]));
if (d <= radius) {
t += floor(e[2] / (1 + d));
}
}
if (mx < t) {
mx = t;
ans = {i, j};
}
}
}
return ans;
}
};
第二种:遍历输入坐标
遍历到一个坐标时,计算与其他坐标的distance和信号强度,保存到一个数组中,最后找出信号强度最大的坐标。
难点在如何满足相同强度的坐标返回离原点最小的坐标。
代码待完善:
class Solution {
public:
float getDistance(vector<int>& t1, vector<int>& t2) {
return sqrt((t2[1]-t1[1])*(t2[1]-t1[1]) + (t2[0]-t1[0])*(t2[0]-t1[0]));
}
bool isContainCoor(vector<int>& t1, vector<int>& t2, int radius) {
float d = getDistance(t1, t2);
return (d < radius) ? true:false;
}
int qualityBetween(vector<int>& t1, vector<int>& t2) {
return ( floor(t2[2] / (1+getDistance(t1, t2))) );
}
vector<int> bestCoordinate(vector<vector<int>>& towers, int radius) {
vector<int> qualitys;
for (int i = 0; i < towers.size(); i++)
{
int tempQuality = towers[i][2];
for (int j = 0; j < towers.size(); j++)
{
if (i != j && isContainCoor(towers[i], towers[j], radius))
{
tempQuality += qualityBetween(towers[i], towers[j]);
}
}
qualitys.push_back(tempQuality);
}
int retIdx = max_element(qualitys.begin(), qualitys.end()) - qualitys.begin();
vector<int> ret = { towers[retIdx][0], towers[retIdx][1]};
return ret;
}
};

浙公网安备 33010602011771号