我需要创建一个包含多个1D点的解决方案类,并且可以给出一个中心和一个数字k来计算到该中心的k个最近点。
我的代码,
class Solution {
private:
int center_;
struct Point {
int x;
bool operator<(const Point &other) const {
return (x - center_) * (x - center_) < (other.x - center_) * (other.x - center_);
}
};
public:
vector<int> findNearestKPoints(vector<int> &nums, int k, int center) {
center_ = center;
// vetor<int> to vector<Point>
vector<Point> points;
for (int num : nums) {
points.push_back({num});
}
// partition vector<Point>
nth_element(points.begin(), points.begin() + k - 1, points.end());
// vector<Point> to vector<int>
vector<int> res;
for (int i = 0; i < k; ++i) {
const Point &point = points[i];
res.push_back(point.val);
}
return res;
}
}
但它无法编译。
编译错误是
use of non-static data member 'center_' of 'Solution' from nested type 'Point'
那么如何解决呢? 也许有其他方法来计算最近点。
答案 0 :(得分:4)
您的Point
班级无法访问Solution
班级,因此您无法在Point类代码中使用center_
。这是因为Point
和Solution
是两个不同的类。
要使您的解决方案有效,您需要向Solution
提供有关Point
课程的信息,或使用其他课程进行比较。我建议前者快速解决并使用lambda函数:
bool Point::less( const Solution& sol, const& Point p )
{
return abs(sol.center_ - x) < abs(sol.center_ - p.x);
}
并在你的findNearestKPoints中:
Solution sol{ center };
nth_element(nums.begin(), nums.begin() + k - 1, nums.end(),
[sol]( const& Point a, const& Point b )
{
return a.less( sol, b );
} );
最后,不相关的说明为什么using namespace std
现在如此常见?
答案 1 :(得分:1)
您可以使用lambda并捕获center
:
nth_element(points.begin(), points.begin() + k - 1, points.end(),
[center]( const& Point a, const& Point b ) {
return abs(a.x - center) < abs(b.x - center);
});