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实现,常见的正确做法是:
- 先对数组进行常规排序
- 将排序后的数组拆分为前后两部分,前半部分是较小的元素,后半部分是较大的元素
- 交替从后半部分和前半部分取元素,重新填充原数组
示例代码:
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
相关产品推荐
相关产品推荐

