【发布时间】:2022-01-05 05:36:36
【问题描述】:
我在 leetcode 上做如下问题:https://leetcode.com/problems/contains-duplicate/
给定一个整数数组 nums,如果至少出现任何值,则返回 true 数组中的两次,如果每个元素都是不同的,则返回 false。
我提出的问题的解决方案如下:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
try {
std::sort(nums.begin(), nums.end(), [](int a, int b) {
if (a == b) {
throw std::runtime_error("found duplicate");
}
return a < b;
});
} catch (const std::runtime_error& e) {
return true;
}
return false;
}
};
它在 leetcode 上被接受,但我仍然不确定它是否会一直有效。这个想法是开始对nums 数组进行排序,并在比较器内发现重复值时立即中断。排序算法可以通过多种方式比较元素。我希望总是比较相等的元素,但我不确定这一点。 std::sort 是否总是比较相等的值,或者有时它可以跳过比较它们,因此不会找到重复的值?
【问题讨论】:
-
你怎么想的,std::sort 知道值相等而不比较它们?
-
排序如何在不比较它们的情况下判断这些数字的排列顺序?一般来说,每两个连续的数字至少会比较一次。
-
False positives 也可以。
-
这是一个完美的例子,说明为什么像 leetcode 这样的编码拼图网站会适得其反。从
std::sort比较器中抛出异常?这样的事情不会在任何工作面试中留下好印象。 -
从比较函数中抛出异常是一种肮脏的技巧,但我实际上很喜欢这种跳出框框的思维方式!竖起大拇指!