You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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; 
    }
};

如果要保留你原有的自定义比较函数逻辑,只需统一类型即可:

  1. 将sortByFirst的入参类型改为const pair<double,vector<int>> &
  2. 插入storingData时不要强转距离为int,直接使用计算得到的double值

内容的提问来源于stack exchange,提问作者Paula Perdomo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:15:05