C++ LeetCode题解非静态成员函数引用报错与排序失效问题
问题根因
- 精度截断问题:你计算得到的距离是
double类型,但往storingData插入元素时,主动强转为int类型,小数部分直接被丢弃。比如距离2.1、2.9都会被转成2,大量不同距离的元素首字段相等,自然无法按真实距离排序。 - 类型不兼容问题:自定义比较函数
sortByFirst的入参是pair<int,vector<int>>类型,而待排序的storingData元素是pair<double, vector<int>>类型,两者类型不匹配需要做隐式转换。本地IDE编译器对这种转换做了兼容,而LeetCode使用的GCC编译器处理逻辑不符合你的预期,最终表现为排序未生效。
修复方案
pair类型默认按第一个元素升序排序,无需额外自定义比较函数,同时可以直接比较距离平方和(大小关系和实际距离完全一致),避免浮点运算精度问题,修复后代码如下:
class Solution { public: vector<vector<int>> kClosest(vector<vector<int>>& points, int k) { vector<pair<long, vector<int>>> storingData; vector<vector<int>> solution; for(int i = 0; i < points.size(); i++) { long dist_sq = (long)points[i][0] * points[i][0] + (long)points[i][1] * points[i][1]; storingData.emplace_back(dist_sq, points[i]); } sort(storingData.begin(), storingData.end()); for(int i = 0; i < k; i++) { solution.push_back(storingData[i].second); } return solution; } };
如果要保留你原有的自定义比较函数逻辑,只需统一类型即可:
- 将
sortByFirst的入参类型改为const pair<double,vector<int>> & - 插入
storingData时不要强转距离为int,直接使用计算得到的double值
内容的提问来源于stack exchange,提问作者Paula Perdomo
相关产品推荐
相关产品推荐

