我正在解决LeetCode上的搜索插入位置问题。以下代码运行所有测试用例大约需要 9 毫秒。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int lo = 0, hi = nums.size() - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (target < nums[mid]) {
hi = mid - 1;
} else if (target > nums[mid]){
lo = mid + 1;
} else {
return mid;
}
}
return lo;
}
};
当我查看其他人的热门答案时,我发现了一个奇怪的代码片段。当我将代码片段复制粘贴到我的答案中时,上面相同的代码只需要 4 毫秒,这比几乎 99% 的其他解决方案都要快。谁能解释一下加速吗?片段如下:
#include <vector>
#include <iostream>
using namespace std;
static vector<int> nums=[](){
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return vector<int>{};
}();
此代码片段是为了“提高性能”而制作的,但需要付出一定的代价。我来解释一下:
std::ios::sync_with_stdio(false);
这会禁用 C 和 C++ 标准流的同步。默认情况下,它们是同步的,以允许混合 C 和 C++ I/O 流(例如,cout 和 printf 可以在 C++ 文件中编写)。
cin.tie(NULL);
这将 cin 与 cout 解开。同样,默认情况下,它们会导致 cout 出现在 cin 之前(即输出在输入之前刷新),因此您可以进行以下示例:
cout << "Number: ";
cin >> number;
当您解开它们时,您可能会在刷新输出(cout)之前到达输入(cin)。
这些几行有助于使代码运行得更快,但代价是前面解释过的。所以请谨慎使用。
参考资料:https://www.geeksforgeeks.org/fast-io-for-competitive-programming