C++ 里怎么一个简单的 ::std::sort 就能堆溢出呢?
BV1Z64y1a7P1 坑神截图
这周力扣周赛照例去凑热闹。
前两道题很快写完了,T3T4读了题...嗯,不憋了,等坑神的题解吧。
午时十二点,令我十分意外地发现坑神T2竟然罚时了好多次?
T2不就是重载一下 sort 的比较函数吗?看坑神的b站录象[1],再看看评论,才知道 C++ 中的一个惊天大坑。得益于4个月来对 y 总高质量代码风格与良好书写习惯的阅读与模仿,我在考试时“幸运”地避开了这个坑。
但还是很有必要记录一下。
给你一个字符串数组 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"]
其中第 4 大整数是 "3"
示例 2:
输入:nums = ["2","21","12","1"], k = 3
输出:"2"
解释:
nums 中的数字按非递减顺序排列为 ["1","2","12","21"]
其中第 3 大整数是 "2"
示例 3:
输入:nums = ["0","0"], k = 2
输出:"0"
解释:
nums 中的数字按非递减顺序排列为 ["0","0"]
其中第 2 大整数是 "0"
提示:
struct Num
{
string a;
bool operator< (const Num& t) const
{
if (a.size() != t.a.size()) return a.size() < t.a.size();
for (int i = 0; i < a.size(); ++ i)
{
if (a[i] != t.a[i]) return a[i] < t.a[i];
}
return false;
}
};
class Solution {
public:
string kthLargestNumber(vector<string>& nums, int k) {
vector<Num> S;
for (auto&& t: nums)
{
S.push_back({t});
}
sort(S.begin(), S.end());
return S[S.size() - k].a;
}
};
经验:
sort
中,在 operator <
或者 cmp
中 a == b
时一定也得返回 false
!如果不返回 false
而是 true
将造成堆栈溢出!a<b
,会返回true。同样的,问b>a
的话,也会返回true。ab且ba就出现了循环。排序也就没有意义了”此外,一些关于重载效率的对比如下:
struct
重载operator<
):执行用时 236ms 内存消耗 76.9MBlambda
重载sort
):执行用时 132ms 内存消耗 53.8MBsort
):执行用时 592ms 内存消耗 341.7MB代码如下。这让我感觉很费解。
// 力扣官方题解
class Solution {
public:
string kthLargestNumber(vector<string>& nums, int k) {
nth_element(nums.begin(), nums.begin() + k - 1, nums.end(), [](const string& u, const string& v "") {
return u.size() > v.size() || (u.size() == v.size() && u > v);
});
return nums[k - 1];
}
};
// 巨佬墨染空题解
bool inline cmp(string x, string y) {
if (x.size() != y.size()) return x.size() > y.size();
return x > y;
}
class Solution {
public:
string kthLargestNumber(vector<string>& a, int k) {
vector<string> s = a; // 我将此赋值去掉,也没有提升性能
sort(s.begin(), s.end(), cmp);
return s[k - 1];
}
};
[1]
坑神的b站录象: https://www.bilibili.com/video/BV1Z64y1a7P1
[2]
【算法实况】又血崩了,这种题目完全没经验乌乌 - 力扣周赛 - LeetCode Weekly 256: https://www.bilibili.com/video/BV1Z64y1a7P1?p=1
[3]
墨染空: https://leetcode-cn.com/u/mo-ran-kong/