当前位置: 首页 > 科技观察

C++中的简单--std--sort怎么会导致堆溢出?

时间:2023-03-17 00:51:31 科技观察

C++中的一个简单的::std::sort怎么会溢出堆?前两道题写的很快,T3T4看题……嗯,别憋着,等大神来解题吧。下午十二点的时候,我很惊讶的发现坑神T2居然罚了很多次时间?T2不就是重载了sort的比较函数吗?看坑神的b站视频[1],再看评论。才知道C++的一个惊天坑。得益于4个月的阅读和模仿y的优质代码风格和良好的书写习惯,我在考试的时候“幸运”的避开了这个坑。但是还是有必要记录一下。问题:找到数组中第K个最大的整数给你一个字符串数组nums和一个整数k。nums中的每个字符串代表一个不带前导零的整数。返回表示nums中第k个最大整数的字符串。注意:重复的数字在计数时将被视为不同的元素。例如,如果nums是["1","2","2"],那么"2"是最大整数,"2"是第二大整数,"1"是第三大整数。示例1:输入:nums=["3","6","7","10"],k=4输出:"3"解释:nums中的数字按非递减顺序排列为["3","6","7","10"]其中第四大整数为"3"示例2:输入:nums=["2","21","12","1"],k=3output:"2"解释:nums中的数字非降序排列为["1","2","12","21"]其中第三大整数为"2"例3:输入:nums=["0","0"],k=2输出:"0"解释:nums中的数字按非降序排列为["0","0"]其中第二大整数是“0”提示:1<=k<=nums.length<=1<=nums[i].length<=100nums[i]仅由数字组成nums[i]不包含任何前导零我关闭了-cuffstructNum{stringa;booloperator<(constNum&t)const{if(a.size()!=t.a.size())returna.size()&nums,intk){vectorS;for(auto&&t:nums){S.push_baCk({t});}sort(S.begin(),S.end());returnS[S.size()-k].a;}};心得:在重载排序中,在operator&nums,intk){nth_element(nums.begin(),nums.begin()+k-1,nums.end(),[](conststring&u,conststring&v""){returnu.size()>v.size()||(u.size()==v.size()&&u>v);});returnnums[k-1];}};/Boolinlinecmp(stringx,stringy){if(x.size()!=y.size())returnx.size()>y.size();returnx>y;}classSolution{public:stringkthLargestNumber(vector&a,intk){vectors=a;//我去掉了这个赋值,并没有提高性能sort(s.begin(),s.end(),cmp);returns[k-1];}};参考资料[1]坑神B站视频:https://www.bilibili.com/video/BV1Z64y1a7P1[2]【算法直播】血又崩了,这种题目完全没有经验呜呜-力扣周赛-力扣周刊256:https://www.bilibili.com/video/BV1Z64y1a7P1?p=1[3]莫冉空:https://leetcode-cn.com/u/墨然空/