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

LeetCode摆动排序II问题求助:自定义比较器排序出错

摆动排序II代码问题排查

你的代码存在以下几个关键问题:

1. 静态函数非法访问非静态成员

comp是静态成员函数,但它试图访问类的非静态成员变量cnt——C++中静态函数属于类本身,不绑定具体对象,根本无法直接访问对象的非静态成员,这会直接导致编译错误。

2. 违反sort比较器的核心规则

STL的sort要求自定义比较器必须满足严格弱序,核心要求是:

  • 不能依赖外部状态(比如你的cnt计数器),相同的两个元素每次比较必须返回相同结果
  • 必须满足自反性(comp(a,a)必须返回false)、不对称性、传递性

你的比较器每次调用都会修改cnt,导致相同的a和b在不同时机调用会返回不同结果,完全破坏了sort的排序逻辑,最终输出的数组肯定不符合摆动排序的要求。

3. 返回值错误

wiggleSort函数的返回类型是void,但你写了return nums;,这会触发编译错误。

正确实现思路

摆动排序II要求数组满足nums[0] < nums[1] > nums[2] < nums[3] > ...,不能通过自定义比较器直接用sort实现,常见的正确做法是:

  1. 先对数组进行常规排序
  2. 将排序后的数组拆分为前后两部分,前半部分是较小的元素,后半部分是较大的元素
  3. 交替从后半部分和前半部分取元素,重新填充原数组

示例代码:

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        vector<int> sorted_nums = nums;
        sort(sorted_nums.begin(), sorted_nums.end());
        
        int n = nums.size();
        int left = (n - 1) / 2; // 前半段最后一个元素的索引
        int right = n - 1;      // 后半段最后一个元素的索引
        
        for (int i = 0; i < n; ++i) {
            if (i % 2 == 0) {
                nums[i] = sorted_nums[left--];
            } else {
                nums[i] = sorted_nums[right--];
            }
        }
    }
};

内容的提问来源于stack exchange,提问作者Shefali Kanaujia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:33:12